《带你学C带你飞》S1E26动动手0
自己写的代码,照着小甲鱼的样例输入,有时候能出来对的结果,有时候会在某个单词后多一个符号,并且这个符号每次运行还不同。代码及注释和运行结果如下:
#include<stdio.h>
#define MAX 1024
int main()
{
int num=0,max_len=0;//保存空格数,将来+1计算单词数;保存最大单词长度
int i=0,j=0,k=0;
char str;
printf("请输入一个英文句子:");
fgets(str,MAX,stdin);
for(i=0;str!='\n';i++)
{
if(str==' ')
{
if(i==0||i>0&&str!=' '&&str!='\0')//给每段空格的第一个改为结束标志
{
if(i!=0)//要是一上来就是空格就不改成结束标志
str='\0';
num++;
if(j>max_len)//一个单词计数完了,看看要不要更新最大长度
max_len=j;
}
}
else
{
if(i==0||i>0&&(str==' '||str=='\0'))//一个新单词开始
j=1;
else
j++;
}
}
if(j>max_len)
max_len=j;//最后一个单词可能没空格,遇到换行符号而退出(fgets保留换行符)
if(str==' ')
num--;
char res;
printf("分割结果已存放到result[%d][%d]的二位数组中...\n",num+1,max_len+1);
k=0;
for(i=0;i<num+1;i++)
{
for(j=0;j<max_len;j++)
{
if(str=='\0'||str=='\n')//这个单词输入完了
{
k++;break;
}
while(str==' ')
k++;
res=str;
}
res='\0';
}
printf("现在依次打印每个单词:\n");
for(i=0;i<num+1;i++)
printf("%s\n",res);
return 0;
}
原体截图 我自己调试的结果是,问题应该在38~51行的最后一个for循环上,因为我前面能做到把每一段空格中的第一个改成结束标志'\0';但我弄不清楚的是res数组里为啥会出现一些看起来很随机的东西,明明我在遍历str的时候遇到'\0'或者'\n'(最后一个单词根据fgets特性应该以'\n'结尾)就break出去然后给这一行的res增加结束标志了呀? 各位大佬走过路过不要错过啊。。。这么神奇(可能是傻逼)的问题。。。这个运行结果太神奇了我真的想不明白呀 不是问题太神奇,,你一下说的太多,看的心累,能不能最简化以下问题,描述清楚 Krant5 发表于 2019-8-19 18:55
不是问题太神奇,,你一下说的太多,看的心累,能不能最简化以下问题,描述清楚
就是题目要求用空格分隔输入的字符串,但我写的程序分隔成功后有时候在一些单词后出现谜之字符,而且每一次运行都有变化。我的思路是在遍历整个字符串,把每一段空格的第一个改成结束符号,标记前一个单词的结束,第一次遍历时确定结果数组的大小(有多少个单词,最大长度多少),第二次遍历时根据之间添加的结束符号把每个单词存进去。
奇怪的地方在于:1.有时候能出正确结果。2.结果不正确时多了字符出来,而同样的输入多出来的字符会变化 本帖最后由 Krant5 于 2019-8-19 23:12 编辑
,你这个代码可读性太差了,问题在于达到了最大长度就直接跳出了,没办法跳过'\n'或者 '\0',会导致空串问题,所以这里首先要加1 ,但是我跟你现象不同,具体你要自己检查了!,我试过还有其他问题 Krant5 发表于 2019-8-19 23:09
,你这个代码可读性太差了,问题在于达到了最大长度就直接跳出了,没办法跳过'\n'或者 '\0',会导致空串问题,所 ...
后面还有一个错就是:res='\0',而不是我写的res='\0'.
谢谢您的回答!
页:
[1]