鱼C论坛

 找回密码
 立即注册
查看: 3128|回复: 28

[已解决]大佬们为什么c一直变啊

[复制链接]
发表于 2022-10-6 19:51:59 | 显示全部楼层 |阅读模式

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

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

x
循环几次之后,一执行strcat,e,d,c三个变量都变了,我输入的是Hold on your hats. Ladies and gentlemen.
https://fishc.com.cn/forum.php?mod=viewthread&tid=70626&extra=page%3D1%26filter%3Dtypeid%26typeid%3D570第一题的问题。javascript:;
下面是代码
#include<stdio.h>
#include<string.h>
int main()
{
        char a[21],b='\0',a1[21]="\0";
        int e=0,d=0,c=0;
        printf("请输入一行文本:");
        while(b!='\n')
        {
                scanf("%s",a1);
                strcat(a,a1);
                b=getchar();
                if(b==' ')
                {
                        c=1;
                        strcat(a," ");
                }
        }
        printf("你输入的文本是:");
        if(strlen(a)<=20)
        {
                printf("%s",a);
        }
        else if(strlen(a)>20&&c==1)
        {
                for(d=20;d>0;d--)
                {
                        if(a[d-1]==' ')
                        {
                                for(d++;d>0;d--,e++)
                                {
                                        printf("%c",a[e]);
                                        return 0;
                                }
                        }
                }
        }
        else
        {
                for(e=0;e<20;e++)
                {
                        printf("%c",a[e]);        
                }
        }
        return 0;        
}
最佳答案
2022-10-6 22:07:57
正天圣人 发表于 2022-10-6 21:57
大佬,我不是要正确答案啊,我想知道为什么我在运行
        printf("请输入一行文本:");
        whi ...


        因为在执行 strcat(a , a1) 的时候,如果发生 a[] 越界,那么,越出部分的字符就会侵占相邻变量的存储空间,导致相关变量的数值发生非预期改变,这就是数组越界带来的危害,是我们写代码第一个要避免出现的问题。
3L%L60RQJF1]MAM0{J3@4C2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-6 19:58:50 | 显示全部楼层
       你这个代码的题目要求是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 20:03:01 | 显示全部楼层
jackz007 发表于 2022-10-6 19:58
你这个代码的题目要求是什么?

要求 A:定义一个长度为 21 的字符数组,用于存放用户输入的文本;PMrek&
要求 B:如果用户输入的文本长度超过 20 个字符,且文本中存在空格,则截取至最接近末尾(第 20 个字符串)的空格;A7?b@$g
要求 C:如果用户输入的文本长度超过 20 个字符,且文本中不存在空格,则打印前 20 个字符。qU2L W!
XvL-*tE3ClP_i$U]O9%xAmjFku
具体实现如下图所示:版权属于:bbs.fishc.com
0#tX38CH=r!P:AFp_vlL6$ZQJW]"-m
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 20:37:35 | 显示全部楼层
本帖最后由 jhq999 于 2022-10-6 20:42 编辑
#include<stdio.h>
int main()
{
    char s[21]={0},ch;
    int i=0;
    while(i<20&&(ch=getchar())!='\n')
    {
        s[i]=ch;
        i+=1;
    }
    if(i==20)
    {
        while(i>=0&&0x20!=s[i])i-=1;
        if(i>=0)s[i]='\0';
    }
    printf("%s",s);
    return 0;
}
#include<stdio.h>
int main()
{
    char s[256]={0},ch;
    int i=0;
    scanf("%[^\n]",s);

    if(s[19])
    {
        i=19;
        while(i>=0&&0x20!=s[i])i-=1;
        if(i>=0)s[i]='\0';
    }
    printf("%s",s);
    return 0;
}
[code]#include<stdio.h>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:00:38 | 显示全部楼层

大佬,我不是要你给答案,我要问的是为什么我错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 21:20:02 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-6 21:39 编辑
#include<stdio.h>
#include<string.h>
int main()
{
        char a[21] , b='\0', a1[21]="" ;
        int e=0,d=0,c=0;
        printf("请输入一行文本:");
        while(b!='\n')
        {
                scanf("%s",a1) ; // 不可以用 scanf() 输入字符串,因为,会漏掉空格字符
                strcat(a,a1)   ; // 连接字符串有风险,当 strlen(a) + strlen(a1) > 20 的时候会使 a[] 越界。
                b=getchar();
       这样处理:
#include <stdio.h>

int main(void)
{
        char ch , a[21]                                                                  ;
        int i , k                                                                        ;
        for(k = 0 ; k < 20 && (ch = getchar()) != '\n' ;) a[k ++] = ch                   ; // 如果输入字符超过 20 个字符,那么,只接收 20 个字符,如果输入不到 20 个字符,那就以实际输入为准
        for(a[k] = '\0' ; k && a[k - 1] == ' ' ; k --) a[k - 1] = '\0'                   ; // 删除 a[] 尾部所有的空格字符  
        if(k == 20) {                                                                      // 如果剩余字符是 20 个,那就意味着需要把相距最近空格之后的所有字符删除掉 
                for(; k && a[k - 1] != ' ' ; k --)                                       ; // 从尾部开始扫描空格字符
                if(k) for(a[k - 1] = '\0' ; k && a[k - 1] == ' ' ; k --) a[k - 1] = '\0' ; // 如果 k 值不为 0 说明 a[k - 1] 就是空格,从这个位置开始向前,删除连续出现的所有空格字符
        }
        printf("%s\n" , a)                                                               ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-10-6 21:26:19 | 显示全部楼层

我用scanf了之后又用getchar()捡起来了空格啊,越界之后就超出21啊,所以才有后面的代码啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 21:26:31 | 显示全部楼层
正天圣人 发表于 2022-10-6 21:00
大佬,我不是要你给答案,我要问的是为什么我错了
char a[21]={0},b='\0',a1[21]="\0";//////a[0]未初始化为'\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:28:54 | 显示全部楼层
本帖最后由 正天圣人 于 2022-10-6 21:31 编辑


上个代码这一步就和我现在写的一样,我上一个代码没问题啊,而且调试这里也没有问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:30:30 | 显示全部楼层

不对啊,你这么写的话,就是a[0]=0了啊,不对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 21:31:21 | 显示全部楼层
正天圣人 发表于 2022-10-6 21:26
我用scanf了之后又用getchar()捡起来了空格啊,越界之后就超出21啊,所以才有后面的代码啊

        你不认为这样做会很被动吗,如果别人在 2 个字符串之间连续输入了 5 个空格你又准备怎么办?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:32:38 | 显示全部楼层
jackz007 发表于 2022-10-6 21:31
你不认为这样做会很被动吗,如果别人在 2 个字符串之间连续输入了 5 个空格你又准备怎么办?

捡起5个空格就行了啊,不是有循环吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 21:37:58 | 显示全部楼层
本帖最后由 jhq999 于 2022-10-6 21:40 编辑
正天圣人 发表于 2022-10-6 21:28
上个代码这一步就和我现在写的一样,我上一个代码没问题啊,而且调试这里也没有问题啊

strcat(a,a1);\\\\这里如果a里面没有"\0",a1会被链接到哪里鬼知道,会越界,如果a有'\0',a[0]不是'\0',a1的不会从a[0]开始链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:40:35 | 显示全部楼层

char a[21],b='\0',a1[21]="\0";
这一句已经定义了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 21:41:23 | 显示全部楼层
正天圣人 发表于 2022-10-6 21:40
char a[21],b='\0',a1[21]="\0";
这一句已经定义了啊

你没有初始化a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:44:32 | 显示全部楼层

调试显示
        printf("请输入一行文本:");
        while(b!='\n')
        {
                scanf("%s",a1);
                strcat(a,a1);
                b=getchar();
                if(b==' ')
                {
                        c=1;
                        strcat(a," ");
                }
        }
过后我的a=="Hold on your hats. La"(我输入的是Hold on your hats. Ladies and gentlemen.)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:47:51 | 显示全部楼层

而且一开始调试台是这样显示的a = "\000\001\000\000\000\022\000\000\000d\"w\000h\377b\000\360\027@"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 21:47:59 | 显示全部楼层
正天圣人 发表于 2022-10-6 21:44
调试显示
        printf("请输入一行文本:");
        while(b!='\n')

a[0]是‘H'吗?
while(b!='\n')\\如果字符串大于21,会越界
        {
                scanf("%s",a1);
                strcat(a,a1);
                b=getchar();
                if(b==' ')
                {
                        c=1;
                        strcat(a," ");
                }
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:48:28 | 显示全部楼层
正天圣人 发表于 2022-10-6 21:47
而且一开始调试台是这样显示的a = "\000\001\000\000\000\022\000\000\000d\"w\000h\377b\000\360\027@"

这样就是初始化了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 21:49:36 | 显示全部楼层
正天圣人 发表于 2022-10-6 21:48
这样就是初始化了啊

a[0]为空啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-8 01:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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