鱼C论坛

 找回密码
 立即注册
查看: 2735|回复: 7

《带你学C带你飞》S1E26动动手0

[复制链接]
发表于 2019-8-19 14:20:16 | 显示全部楼层 |阅读模式

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

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

x
自己写的代码,照着小甲鱼的样例输入,有时候能出来对的结果,有时候会在某个单词后多一个符号,并且这个符号每次运行还不同。
代码及注释和运行结果如下:
  1. #include<stdio.h>
  2. #define MAX 1024
  3. int main()
  4. {
  5. int num=0,max_len=0;//保存空格数,将来+1计算单词数;保存最大单词长度
  6.     int i=0,j=0,k=0;
  7.     char str[MAX];
  8.     printf("请输入一个英文句子:");
  9.     fgets(str,MAX,stdin);
  10.     for(i=0;str[i]!='\n';i++)
  11.     {
  12.         if(str[i]==' ')
  13.         {
  14.             if(i==0||i>0&&str[i-1]!=' '&&str[i-1]!='\0')//给每段空格的第一个改为结束标志
  15.             {
  16.                 if(i!=0)//要是一上来就是空格就不改成结束标志
  17.                     str[i]='\0';
  18.                 num++;
  19.                 if(j>max_len)//一个单词计数完了,看看要不要更新最大长度
  20.                     max_len=j;
  21.             }
  22.         }
  23.         else
  24.         {
  25.             if(i==0||i>0&&(str[i-1]==' '||str[i-1]=='\0'))//一个新单词开始
  26.                 j=1;
  27.             else
  28.                 j++;
  29.         }
  30.     }
  31.     if(j>max_len)
  32.         max_len=j;//最后一个单词可能没空格,遇到换行符号而退出(fgets保留换行符)
  33.     if(str[0]==' ')
  34.         num--;
  35.     char res[num+1][max_len+1];
  36.     printf("分割结果已存放到result[%d][%d]的二位数组中...\n",num+1,max_len+1);
  37.     k=0;
  38.     for(i=0;i<num+1;i++)
  39.     {
  40.         for(j=0;j<max_len;j++)
  41.         {
  42.             if(str[k]=='\0'||str[k]=='\n')//这个单词输入完了
  43.             {
  44.                 k++;break;
  45.             }
  46.             while(str[k]==' ')
  47.                 k++;
  48.             res[i][j]=str[k++];
  49.         }
  50.         res[i][j+1]='\0';
  51.     }
  52. printf("现在依次打印每个单词:\n");
  53.     for(i=0;i<num+1;i++)
  54.         printf("%s\n",res[i]);
  55.     return 0;
  56. }
复制代码


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

使用道具 举报

 楼主| 发表于 2019-8-19 14:23:50 | 显示全部楼层
原体截图
无标题2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 16:08:53 | 显示全部楼层
我自己调试的结果是,问题应该在38~51行的最后一个for循环上,因为我前面能做到把每一段空格中的第一个改成结束标志'\0';但我弄不清楚的是res数组里为啥会出现一些看起来很随机的东西,明明我在遍历str的时候遇到'\0'或者'\n'(最后一个单词根据fgets特性应该以'\n'结尾)就break出去然后给这一行的res增加结束标志了呀?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 18:21:20 | 显示全部楼层
各位大佬走过路过不要错过啊。。。这么神奇(可能是傻逼)的问题。。。这个运行结果太神奇了我真的想不明白呀
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 18:55:29 | 显示全部楼层
不是问题太神奇,,你一下说的太多,看的心累,能不能最简化以下问题,描述清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 21:27:11 | 显示全部楼层
Krant5 发表于 2019-8-19 18:55
不是问题太神奇,,你一下说的太多,看的心累,能不能最简化以下问题,描述清楚

就是题目要求用空格分隔输入的字符串,但我写的程序分隔成功后有时候在一些单词后出现谜之字符,而且每一次运行都有变化。我的思路是在遍历整个字符串,把每一段空格的第一个改成结束符号,标记前一个单词的结束,第一次遍历时确定结果数组的大小(有多少个单词,最大长度多少),第二次遍历时根据之间添加的结束符号把每个单词存进去。
奇怪的地方在于:1.有时候能出正确结果。2.结果不正确时多了字符出来,而同样的输入多出来的字符会变化
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 23:09:18 | 显示全部楼层
本帖最后由 Krant5 于 2019-8-19 23:12 编辑

,你这个代码可读性太差了,问题在于达到了最大长度就直接跳出了,没办法跳过'\n'或者 '\0',会导致空串问题,所以这里首先要加1 ,但是我跟你现象不同,具体你要自己检查了!,我试过还有其他问题
TN@YIZQKX~N7VME608Z(MQN.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-20 20:36:24 | 显示全部楼层
Krant5 发表于 2019-8-19 23:09
,你这个代码可读性太差了,问题在于达到了最大长度就直接跳出了,没办法跳过'\n'或者 '\0',会导致空串问题,所 ...

后面还有一个错就是:res[i][j]='\0',而不是我写的res[i][j+1]='\0'.
谢谢您的回答!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 17:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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