鱼C论坛

 找回密码
 立即注册
查看: 1315|回复: 2

[已解决]c,没有报错,运行结果前一步用printf打印还是对的,最后一步打印出来就不对

[复制链接]
发表于 2020-11-4 20:09:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>

  2. // 分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,
  3. //返回由单词组成的二维数组
  4. //不论是一个空格还是多个空格,你的程序都能够正确识别出单词来
  5. int main()
  6. {
  7.    char str1[100];
  8.    printf("enter a sentence:");
  9.    fgets(str1, 100, stdin);
  10.    printf("%s\n",str1);
  11.    
  12.    int i = 0,kongge = 0;
  13.    do
  14.    {
  15.                    if(str1[i] ==' ')
  16.                    {
  17.                            kongge++;
  18.                 }
  19.                 i++;
  20.    }while(str1[i] != '\0');
  21.    
  22.    
  23.    int string_num = 0;
  24.    if(str1[0] == ' ')
  25.    {
  26.                    string_num = kongge;
  27.    }
  28.    else
  29.    {
  30.                string_num = kongge + 1;
  31.         }
  32.    
  33.    int j = 0,z = 0,m = 0;
  34.    char array[string_num][1];
  35.    int k = 0;
  36.    do
  37.    {
  38.                    if(str1[k] !=' ')
  39.                    {
  40.                            *(*(array + j) + m) =  str1[k]; //将字符一个个存进二维数组,如何遇到空格,二维数组当前行存储结束,从下一行开始存储
  41.                            printf("str1[k] = %c ,*(*(array + j) + m) = %c,j = %d,m = %d \n",str1[k],*(*(array + j) + m),j,m);
  42.                            m++;
  43.                 }
  44.                 else
  45.                 {
  46.                         printf("*(array + j) = %s,j = %d,m = %d \n",array[j],j,m);
  47.                            j++;
  48.                            m = 0;
  49.                 }

  50.                 k++;
  51.                
  52.    }while(str1[k] != '\0');
  53.    
  54. //   printf("kong = %d \n",kongge);
  55. //   printf(" %c",str1[2]);
  56.    for(z = 0; z<string_num; z++)
  57.    {
  58.                    printf("%s\n",array[z]);
  59.    }
  60.    
  61. }
复制代码
最佳答案
2020-11-4 22:48:51
因为你的35行定义二维数组的时候第二维长度不对,导致第一个字符串占用了后面字符串的位置,然后又被后面的覆盖了。
比如输入: abc de fg
那么第一个字符串一个是abc,但是你得意的第二维长度为1,所及就会挤占后面的位置,读到第二个字符串de的时候就会覆盖掉bc,再读到fg的时候,就会覆盖掉e
此外二维数组的每一行末尾你没有加'\0',那么在%s打印的时候就不会按照行打印,%s是遇到\0'才停止
帮你修改了一下,四处修改。做了注释
  1. #include <stdio.h>

  2. // 分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,
  3. //返回由单词组成的二维数组
  4. //不论是一个空格还是多个空格,你的程序都能够正确识别出单词来
  5. int main()
  6. {
  7.     char str1[100];
  8.     printf("enter a sentence:");
  9.     fgets(str1, 100, stdin);
  10.     printf("%s\n",str1);
  11.    
  12.     int i = 0,kongge = 0,len=0,maxlen=0;//第一处、加了两个变量,找最长的字符串
  13.     do        //第二处、在这个循环中,添加了几行代码,除了找空格数以外,再找一下最长连续字符串的长度
  14.     {
  15.         if(str1[i] ==' ')
  16.         {
  17.             kongge++;
  18.             if(len>maxlen)
  19.                 maxlen=len;
  20.             len=0;
  21.         }
  22.         else
  23.             len++;
  24.         i++;
  25.     }while(str1[i] != '\0');
  26.    
  27.    
  28.     int string_num = 0;
  29.     if(str1[0] == ' ')
  30.     {
  31.         string_num = kongge;
  32.     }
  33.     else
  34.     {
  35.         string_num = kongge + 1;
  36.         }
  37.    
  38.     int j = 0,z = 0,m = 0;
  39.     char array[string_num][maxlen+1]; //第三处、这里的第二维是最长字符串长度+1,需要存放末尾的'\0'
  40.     int k = 0;
  41.     do
  42.     {
  43.         if(str1[k] !=' ')
  44.         {
  45.            *(*(array + j) + m) =  str1[k]; //第四处、将字符一个个存进二维数组,如何遇到空格,二维数组当前行存储结束,从下一行开始存储
  46.            printf("str1[k] = %c ,*(*(array + j) + m) = %c,j = %d,m = %d \n",str1[k],*(*(array + j) + m),j,m);
  47.            m++;
  48.         }
  49.         else
  50.         {
  51.             *(*(array + j) + m) =  '\0';//末尾添加'\0'
  52.             printf("*(array + j) = %s,j = %d,m = %d \n",array[j],j,m);
  53.             j++;
  54.             m = 0;
  55.         }
  56.         
  57.         k++;
  58.                
  59.     }while(str1[k] != '\0');
  60.    
  61.     //   printf("kong = %d \n",kongge);
  62.     //   printf(" %c",str1[2]);
  63.     for(z = 0; z<string_num; z++)
  64.     {
  65.         printf("%s\n",array[z]);
  66.     }
  67.     printf("%d,%d",maxlen,string_num);
  68.    
  69. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-4 22:13:28 | 显示全部楼层
看不明白你第35行是什么想法,解释一下吧,这种定义是不允许的,你解释一下,我看看能不能根据你的意思,修改一下程序
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-4 22:48:51 | 显示全部楼层    本楼为最佳答案   
因为你的35行定义二维数组的时候第二维长度不对,导致第一个字符串占用了后面字符串的位置,然后又被后面的覆盖了。
比如输入: abc de fg
那么第一个字符串一个是abc,但是你得意的第二维长度为1,所及就会挤占后面的位置,读到第二个字符串de的时候就会覆盖掉bc,再读到fg的时候,就会覆盖掉e
此外二维数组的每一行末尾你没有加'\0',那么在%s打印的时候就不会按照行打印,%s是遇到\0'才停止
帮你修改了一下,四处修改。做了注释
  1. #include <stdio.h>

  2. // 分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,
  3. //返回由单词组成的二维数组
  4. //不论是一个空格还是多个空格,你的程序都能够正确识别出单词来
  5. int main()
  6. {
  7.     char str1[100];
  8.     printf("enter a sentence:");
  9.     fgets(str1, 100, stdin);
  10.     printf("%s\n",str1);
  11.    
  12.     int i = 0,kongge = 0,len=0,maxlen=0;//第一处、加了两个变量,找最长的字符串
  13.     do        //第二处、在这个循环中,添加了几行代码,除了找空格数以外,再找一下最长连续字符串的长度
  14.     {
  15.         if(str1[i] ==' ')
  16.         {
  17.             kongge++;
  18.             if(len>maxlen)
  19.                 maxlen=len;
  20.             len=0;
  21.         }
  22.         else
  23.             len++;
  24.         i++;
  25.     }while(str1[i] != '\0');
  26.    
  27.    
  28.     int string_num = 0;
  29.     if(str1[0] == ' ')
  30.     {
  31.         string_num = kongge;
  32.     }
  33.     else
  34.     {
  35.         string_num = kongge + 1;
  36.         }
  37.    
  38.     int j = 0,z = 0,m = 0;
  39.     char array[string_num][maxlen+1]; //第三处、这里的第二维是最长字符串长度+1,需要存放末尾的'\0'
  40.     int k = 0;
  41.     do
  42.     {
  43.         if(str1[k] !=' ')
  44.         {
  45.            *(*(array + j) + m) =  str1[k]; //第四处、将字符一个个存进二维数组,如何遇到空格,二维数组当前行存储结束,从下一行开始存储
  46.            printf("str1[k] = %c ,*(*(array + j) + m) = %c,j = %d,m = %d \n",str1[k],*(*(array + j) + m),j,m);
  47.            m++;
  48.         }
  49.         else
  50.         {
  51.             *(*(array + j) + m) =  '\0';//末尾添加'\0'
  52.             printf("*(array + j) = %s,j = %d,m = %d \n",array[j],j,m);
  53.             j++;
  54.             m = 0;
  55.         }
  56.         
  57.         k++;
  58.                
  59.     }while(str1[k] != '\0');
  60.    
  61.     //   printf("kong = %d \n",kongge);
  62.     //   printf(" %c",str1[2]);
  63.     for(z = 0; z<string_num; z++)
  64.     {
  65.         printf("%s\n",array[z]);
  66.     }
  67.     printf("%d,%d",maxlen,string_num);
  68.    
  69. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 03:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表