鱼C论坛

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

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

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

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

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

x
自己写的代码,照着小甲鱼的样例输入,有时候能出来对的结果,有时候会在某个单词后多一个符号,并且这个符号每次运行还不同。
代码及注释和运行结果如下:
#include<stdio.h>
#define MAX 1024
int main()
{
int num=0,max_len=0;//保存空格数,将来+1计算单词数;保存最大单词长度
    int i=0,j=0,k=0;
    char str[MAX];
    printf("请输入一个英文句子:");
    fgets(str,MAX,stdin);
    for(i=0;str[i]!='\n';i++)
    {
        if(str[i]==' ')
        {
            if(i==0||i>0&&str[i-1]!=' '&&str[i-1]!='\0')//给每段空格的第一个改为结束标志
            {
                if(i!=0)//要是一上来就是空格就不改成结束标志
                    str[i]='\0';
                num++;
                if(j>max_len)//一个单词计数完了,看看要不要更新最大长度
                    max_len=j;
            }
        }
        else
        {
            if(i==0||i>0&&(str[i-1]==' '||str[i-1]=='\0'))//一个新单词开始
                j=1;
            else
                j++;
        }
    }
    if(j>max_len)
        max_len=j;//最后一个单词可能没空格,遇到换行符号而退出(fgets保留换行符)
    if(str[0]==' ')
        num--;
    char res[num+1][max_len+1];
    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[k]=='\0'||str[k]=='\n')//这个单词输入完了
            {
                k++;break;
            }
            while(str[k]==' ')
                k++;
            res[i][j]=str[k++];
        }
        res[i][j+1]='\0';
    }
printf("现在依次打印每个单词:\n");
    for(i=0;i<num+1;i++)
        printf("%s\n",res[i]);
    return 0;
}

无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-19 14:23:50 | 显示全部楼层
原体截图
无标题2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2019-8-19 18:55:29 | 显示全部楼层
不是问题太神奇,,你一下说的太多,看的心累,能不能最简化以下问题,描述清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

,你这个代码可读性太差了,问题在于达到了最大长度就直接跳出了,没办法跳过'\n'或者 '\0',会导致空串问题,所以这里首先要加1 ,但是我跟你现象不同,具体你要自己检查了!,我试过还有其他问题
TN@YIZQKX~N7VME608Z(MQN.png
想知道小甲鱼最近在做啥?请访问 -> 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'.
谢谢您的回答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-4 05:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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