user-0 提问: C语言二维数组，字符数组

回复:
user: user-1
content: #include<stdio.h> #include <stdlib.h> #include<string.h>  #define     STR_LEN     128  int main() {     int i, j, n, cnt;     int len, row, col;     char str[STR_LEN];     char **pstr;      fgets(str, STR_LEN, stdin);     scanf("%d", &n);     if (n >= STR_LEN-1)         n = STR_LEN-1;      len = strlen(str);     if (len < STR_LEN)         len -= 1;     row = len / n + 1;     col = n + 1;     pstr = (char **)malloc(sizeof(char *) * row + 1);     if (!pstr)         exit(0);      for (i = 0; i < row; i++) {         pstr[i] = (char *)malloc(sizeof(char) * col);         if (!pstr[i])             exit(0);     }      i = 0;     cnt = 0;     while ( i < len && str[i]) {         for (j = 0; j < n; j++)             pstr[cnt][j] = str[i+j];         pstr[cnt][j] = 0;         i += n;         cnt++;     }      for (i = 0; i < cnt; i++)         puts(pstr[i]);      /*     int n,m;     char a[100];     scanf("%d ",&n);     gets(a);     //char b[1000][n];     //char b[1000][n];     char b[100][100];     char c[100];     int len=strlen(a);     int h=0,g=0;     for(int i=0;i<len;i++){         c[h]=a[i];         h++;         if(h==n){             h=0;             strcpy(b[g],c);              // printf("%s\n",b[g]);             g++;         }      }     printf("%s\n",b[0]);     */     return 0; } 供参考～  调用strcpy的前提是c是字符串，即以'\0'结束的。 建议了解一下strcpy， 另外，n是输入的，因此不能做数组的列数。建议用动态申请空间，还可以节省很多空间。

user: user-0
content: 引用 9 楼 qq_1457346882 的回复:[quote=引用 4 楼 Excel_lent 的回复:] [quote=引用 1 楼 user-3 的回复:] 以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。 为啥它们不是字符串呀[/quote] 不是说不是字符串，只是很多函数是要依靠“\０”判断结束的，没有这个会导致功能异常。这就是为什么我上面说还是有点小问题。最好自己重写ｓｔｒｃｐｙ这类函数[/quote] 我把b数组列改为n+1，好像就对了哈

user: user-2
content: char b[1000][n+1]; ... strcpy(b[g],c); strcpyt(&(b[g][n]),'\0'); 好像都有点小问题，自己实现一下这些函数，也不难

user: user-2
content: 引用 4 楼 Excel_lent 的回复:[quote=引用 1 楼 user-3 的回复:] 以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。 为啥它们不是字符串呀[/quote] 不是说不是字符串，只是很多函数是要依靠“\０”判断结束的，没有这个会导致功能异常。这就是为什么我上面说还是有点小问题。最好自己重写ｓｔｒｃｐｙ这类函数

user: user-0
content: 引用 1 楼 user-3 的回复:以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。 应该是开辟的空间不够吧改为b[1000][n+1]  引用 7 楼 自信男孩 的回复:[quote=引用 5 楼 Excel_lent 的回复:] [quote=引用 3 楼 自信男孩 的回复:] #include<stdio.h> #include <stdlib.h> #include<string.h>  #define     STR_LEN     128  int main() {     int i, j, n, cnt;     int len, row, col;     char str[STR_LEN];     char **pstr;      fgets(str, STR_LEN, stdin);     scanf("%d", &n);     if (n >= STR_LEN-1)         n = STR_LEN-1;      len = strlen(str);     if (len < STR_LEN)         len -= 1;     row = len / n + 1;     col = n + 1;     pstr = (char **)malloc(sizeof(char *) * row + 1);     if (!pstr)         exit(0);      for (i = 0; i < row; i++) {         pstr[i] = (char *)malloc(sizeof(char) * col);         if (!pstr[i])             exit(0);     }      i = 0;     cnt = 0;     while ( i < len && str[i]) {         for (j = 0; j < n; j++)             pstr[cnt][j] = str[i+j];         pstr[cnt][j] = 0;         i += n;         cnt++;     }      for (i = 0; i < cnt; i++)         puts(pstr[i]);      /*     int n,m;     char a[100];     scanf("%d ",&n);     gets(a);     //char b[1000][n];     //char b[1000][n];     char b[100][100];     char c[100];     int len=strlen(a);     int h=0,g=0;     for(int i=0;i<len;i++){         c[h]=a[i];         h++;         if(h==n){             h=0;             strcpy(b[g],c);              // printf("%s\n",b[g]);             g++;         }      }     printf("%s\n",b[0]);     */     return 0; } 供参考～  调用strcpy的前提是c是字符串，即以'\0'结束的。 建议了解一下strcpy， 另外，n是输入的，因此不能做数组的列数。建议用动态申请空间，还可以节省很多空间。 谢谢大佬，初学者有点难看懂哈[/quote]  首先可以试一下，先看对不对。 另外，楼主还没学习malloc、二重指针这些吗？[/quote] 去年学了一学期的c，关于malloc，指针，二重指针，老师都讲的很模糊也很简单只是稍微了解了一下，搞得后面数据结构也学的很吃力。 上面那个问题，我把b数组列改为n+1，好像就对了哈

user: user-1
content: 引用 5 楼 Excel_lent 的回复:[quote=引用 3 楼 自信男孩 的回复:] #include<stdio.h> #include <stdlib.h> #include<string.h>  #define     STR_LEN     128  int main() {     int i, j, n, cnt;     int len, row, col;     char str[STR_LEN];     char **pstr;      fgets(str, STR_LEN, stdin);     scanf("%d", &n);     if (n >= STR_LEN-1)         n = STR_LEN-1;      len = strlen(str);     if (len < STR_LEN)         len -= 1;     row = len / n + 1;     col = n + 1;     pstr = (char **)malloc(sizeof(char *) * row + 1);     if (!pstr)         exit(0);      for (i = 0; i < row; i++) {         pstr[i] = (char *)malloc(sizeof(char) * col);         if (!pstr[i])             exit(0);     }      i = 0;     cnt = 0;     while ( i < len && str[i]) {         for (j = 0; j < n; j++)             pstr[cnt][j] = str[i+j];         pstr[cnt][j] = 0;         i += n;         cnt++;     }      for (i = 0; i < cnt; i++)         puts(pstr[i]);      /*     int n,m;     char a[100];     scanf("%d ",&n);     gets(a);     //char b[1000][n];     //char b[1000][n];     char b[100][100];     char c[100];     int len=strlen(a);     int h=0,g=0;     for(int i=0;i<len;i++){         c[h]=a[i];         h++;         if(h==n){             h=0;             strcpy(b[g],c);              // printf("%s\n",b[g]);             g++;         }      }     printf("%s\n",b[0]);     */     return 0; } 供参考～  调用strcpy的前提是c是字符串，即以'\0'结束的。 建议了解一下strcpy， 另外，n是输入的，因此不能做数组的列数。建议用动态申请空间，还可以节省很多空间。 谢谢大佬，初学者有点难看懂哈[/quote]  首先可以试一下，先看对不对。 另外，楼主还没学习malloc、二重指针这些吗？

user: user-0
content: 引用 2 楼 qq_1457346882 的回复:char b[1000][n+1]; ... strcpy(b[g],c); strcpyt(&(b[g][n]),'\0'); 好像都有点小问题，自己实现一下这些函数，也不难 我把b[1000][n]的n改为n+1后。好像就对了哈

user: user-0
content: 引用 3 楼 自信男孩 的回复:#include<stdio.h> #include <stdlib.h> #include<string.h>  #define     STR_LEN     128  int main() {     int i, j, n, cnt;     int len, row, col;     char str[STR_LEN];     char **pstr;      fgets(str, STR_LEN, stdin);     scanf("%d", &n);     if (n >= STR_LEN-1)         n = STR_LEN-1;      len = strlen(str);     if (len < STR_LEN)         len -= 1;     row = len / n + 1;     col = n + 1;     pstr = (char **)malloc(sizeof(char *) * row + 1);     if (!pstr)         exit(0);      for (i = 0; i < row; i++) {         pstr[i] = (char *)malloc(sizeof(char) * col);         if (!pstr[i])             exit(0);     }      i = 0;     cnt = 0;     while ( i < len && str[i]) {         for (j = 0; j < n; j++)             pstr[cnt][j] = str[i+j];         pstr[cnt][j] = 0;         i += n;         cnt++;     }      for (i = 0; i < cnt; i++)         puts(pstr[i]);      /*     int n,m;     char a[100];     scanf("%d ",&n);     gets(a);     //char b[1000][n];     //char b[1000][n];     char b[100][100];     char c[100];     int len=strlen(a);     int h=0,g=0;     for(int i=0;i<len;i++){         c[h]=a[i];         h++;         if(h==n){             h=0;             strcpy(b[g],c);              // printf("%s\n",b[g]);             g++;         }      }     printf("%s\n",b[0]);     */     return 0; } 供参考～  调用strcpy的前提是c是字符串，即以'\0'结束的。 建议了解一下strcpy， 另外，n是输入的，因此不能做数组的列数。建议用动态申请空间，还可以节省很多空间。 谢谢大佬，初学者有点难看懂哈

user: user-0
content: 引用 1 楼 user-3 的回复:以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。 为啥它们不是字符串呀

user: user-3
content: 以'\0'为结束符的字符数组才是字符串；数组b，c都不是字符串，用strcpy，%s这些操作存在问题。