大佬们为什么c一直变啊
循环几次之后,一执行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,b='\0',a1="\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==' ')
{
for(d++;d>0;d--,e++)
{
printf("%c",a);
return 0;
}
}
}
}
else
{
for(e=0;e<20;e++)
{
printf("%c",a);
}
}
return 0;
} 你这个代码的题目要求是什么? 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
本帖最后由 jhq999 于 2022-10-6 20:42 编辑
#include<stdio.h>
int main()
{
char s={0},ch;
int i=0;
while(i<20&&(ch=getchar())!='\n')
{
s=ch;
i+=1;
}
if(i==20)
{
while(i>=0&&0x20!=s)i-=1;
if(i>=0)s='\0';
}
printf("%s",s);
return 0;
}
#include<stdio.h>
int main()
{
char s={0},ch;
int i=0;
scanf("%[^\n]",s);
if(s)
{
i=19;
while(i>=0&&0x20!=s)i-=1;
if(i>=0)s='\0';
}
printf("%s",s);
return 0;
}
#include<stdio.h> jhq999 发表于 2022-10-6 20:37
#include
大佬,我不是要你给答案,我要问的是为什么我错了 本帖最后由 jackz007 于 2022-10-6 21:39 编辑
#include<stdio.h>
#include<string.h>
int main()
{
char a , b='\0', a1="" ;
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 ;
int i , k ;
for(k = 0 ; k < 20 && (ch = getchar()) != '\n' ;) a = ch ; // 如果输入字符超过 20 个字符,那么,只接收 20 个字符,如果输入不到 20 个字符,那就以实际输入为准
for(a = '\0' ; k && a == ' ' ; k --) a = '\0' ; // 删除 a[] 尾部所有的空格字符
if(k == 20) { // 如果剩余字符是 20 个,那就意味着需要把相距最近空格之后的所有字符删除掉
for(; k && a != ' ' ; k --) ; // 从尾部开始扫描空格字符
if(k) for(a = '\0' ; k && a == ' ' ; k --) a = '\0' ; // 如果 k 值不为 0 说明 a 就是空格,从这个位置开始向前,删除连续出现的所有空格字符
}
printf("%s\n" , a) ;
} jackz007 发表于 2022-10-6 21:20
我用scanf了之后又用getchar()捡起来了空格啊,越界之后就超出21啊,所以才有后面的代码啊 正天圣人 发表于 2022-10-6 21:00
大佬,我不是要你给答案,我要问的是为什么我错了
char a={0},b='\0',a1="\0";//////a未初始化为'\0' 本帖最后由 正天圣人 于 2022-10-6 21:31 编辑
jhq999 发表于 2022-10-6 21:26
上个代码这一步就和我现在写的一样,我上一个代码没问题啊,而且调试这里也没有问题啊 jhq999 发表于 2022-10-6 21:26
不对啊,你这么写的话,就是a=0了啊,不对啊 正天圣人 发表于 2022-10-6 21:26
我用scanf了之后又用getchar()捡起来了空格啊,越界之后就超出21啊,所以才有后面的代码啊
你不认为这样做会很被动吗,如果别人在 2 个字符串之间连续输入了 5 个空格你又准备怎么办? jackz007 发表于 2022-10-6 21:31
你不认为这样做会很被动吗,如果别人在 2 个字符串之间连续输入了 5 个空格你又准备怎么办?
捡起5个空格就行了啊,不是有循环吗 本帖最后由 jhq999 于 2022-10-6 21:40 编辑
正天圣人 发表于 2022-10-6 21:28
上个代码这一步就和我现在写的一样,我上一个代码没问题啊,而且调试这里也没有问题啊
strcat(a,a1);\\\\这里如果a里面没有"\0",a1会被链接到哪里鬼知道,会越界,如果a有'\0',a不是'\0',a1的不会从a开始链接 jhq999 发表于 2022-10-6 21:37
char a,b='\0',a1="\0";
这一句已经定义了啊 正天圣人 发表于 2022-10-6 21:40
char a,b='\0',a1="\0";
这一句已经定义了啊
你没有初始化a jhq999 发表于 2022-10-6 21:41
你没有初始化a
调试显示
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.) jhq999 发表于 2022-10-6 21:41
你没有初始化a
而且一开始调试台是这样显示的a = "\000\001\000\000\000\022\000\000\000d\"w\000h\377b\000\360\027@" 正天圣人 发表于 2022-10-6 21:44
调试显示
printf("请输入一行文本:");
while(b!='\n')
a是‘H'吗?
while(b!='\n')\\如果字符串大于21,会越界
{
scanf("%s",a1);
strcat(a,a1);
b=getchar();
if(b==' ')
{
c=1;
strcat(a," ");
}
} 正天圣人 发表于 2022-10-6 21:47
而且一开始调试台是这样显示的a = "\000\001\000\000\000\022\000\000\000d\"w\000h\377b\000\360\027@"
这样就是初始化了啊 正天圣人 发表于 2022-10-6 21:48
这样就是初始化了啊
a为空啊
页:
[1]
2