猪猪虾 发表于 2020-11-4 20:09:28

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

#include <stdio.h>

// 分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,
//返回由单词组成的二维数组
//不论是一个空格还是多个空格,你的程序都能够正确识别出单词来
int main()
{
   char str1;
   printf("enter a sentence:");
   fgets(str1, 100, stdin);
   printf("%s\n",str1);
   
   int i = 0,kongge = 0;
   do
   {
                   if(str1 ==' ')
                   {
                           kongge++;
                }
                i++;
   }while(str1 != '\0');
   
   
   int string_num = 0;
   if(str1 == ' ')
   {
                   string_num = kongge;
   }
   else
   {
             string_num = kongge + 1;
        }
   
   int j = 0,z = 0,m = 0;
   char array;
   int k = 0;
   do
   {
                   if(str1 !=' ')
                   {
                           *(*(array + j) + m) =str1; //将字符一个个存进二维数组,如何遇到空格,二维数组当前行存储结束,从下一行开始存储
                           printf("str1 = %c ,*(*(array + j) + m) = %c,j = %d,m = %d \n",str1,*(*(array + j) + m),j,m);
                           m++;
                }
                else
                {
                        printf("*(array + j) = %s,j = %d,m = %d \n",array,j,m);
                           j++;
                           m = 0;
                }

                k++;
               
   }while(str1 != '\0');
   
//   printf("kong = %d \n",kongge);
//   printf(" %c",str1);
   for(z = 0; z<string_num; z++)
   {
                   printf("%s\n",array);
   }
   
}

乐乐学编程 发表于 2020-11-4 22:13:28

看不明白你第35行是什么想法,解释一下吧,这种定义是不允许的,你解释一下,我看看能不能根据你的意思,修改一下程序

sunrise085 发表于 2020-11-4 22:48:51

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

// 分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,
//返回由单词组成的二维数组
//不论是一个空格还是多个空格,你的程序都能够正确识别出单词来
int main()
{
    char str1;
    printf("enter a sentence:");
    fgets(str1, 100, stdin);
    printf("%s\n",str1);
   
    int i = 0,kongge = 0,len=0,maxlen=0;//第一处、加了两个变量,找最长的字符串
    do      //第二处、在这个循环中,添加了几行代码,除了找空格数以外,再找一下最长连续字符串的长度
    {
      if(str1 ==' ')
      {
            kongge++;
            if(len>maxlen)
                maxlen=len;
            len=0;
      }
      else
            len++;
      i++;
    }while(str1 != '\0');
   
   
    int string_num = 0;
    if(str1 == ' ')
    {
      string_num = kongge;
    }
    else
    {
      string_num = kongge + 1;
      }
   
    int j = 0,z = 0,m = 0;
    char array; //第三处、这里的第二维是最长字符串长度+1,需要存放末尾的'\0'
    int k = 0;
    do
    {
      if(str1 !=' ')
      {
         *(*(array + j) + m) =str1; //第四处、将字符一个个存进二维数组,如何遇到空格,二维数组当前行存储结束,从下一行开始存储
         printf("str1 = %c ,*(*(array + j) + m) = %c,j = %d,m = %d \n",str1,*(*(array + j) + m),j,m);
         m++;
      }
      else
      {
            *(*(array + j) + m) ='\0';//末尾添加'\0'
            printf("*(array + j) = %s,j = %d,m = %d \n",array,j,m);
            j++;
            m = 0;
      }
      
      k++;
               
    }while(str1 != '\0');
   
    //   printf("kong = %d \n",kongge);
    //   printf(" %c",str1);
    for(z = 0; z<string_num; z++)
    {
      printf("%s\n",array);
    }
    printf("%d,%d",maxlen,string_num);
   
}
页: [1]
查看完整版本: c,没有报错,运行结果前一步用printf打印还是对的,最后一步打印出来就不对