正天圣人 发表于 2022-10-6 19:51:59

大佬们为什么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:50

       你这个代码的题目要求是什么?

正天圣人 发表于 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

jhq999 发表于 2022-10-6 20:37:35

本帖最后由 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>

正天圣人 发表于 2022-10-6 21:00:38

jhq999 发表于 2022-10-6 20:37
#include

大佬,我不是要你给答案,我要问的是为什么我错了

jackz007 发表于 2022-10-6 21:20:02

本帖最后由 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)                                                               ;
}

正天圣人 发表于 2022-10-6 21:26:19

jackz007 发表于 2022-10-6 21:20


我用scanf了之后又用getchar()捡起来了空格啊,越界之后就超出21啊,所以才有后面的代码啊

jhq999 发表于 2022-10-6 21:26:31

正天圣人 发表于 2022-10-6 21:00
大佬,我不是要你给答案,我要问的是为什么我错了

char a={0},b='\0',a1="\0";//////a未初始化为'\0'

正天圣人 发表于 2022-10-6 21:28:54

本帖最后由 正天圣人 于 2022-10-6 21:31 编辑

jhq999 发表于 2022-10-6 21:26


上个代码这一步就和我现在写的一样,我上一个代码没问题啊,而且调试这里也没有问题啊

正天圣人 发表于 2022-10-6 21:30:30

jhq999 发表于 2022-10-6 21:26


不对啊,你这么写的话,就是a=0了啊,不对啊

jackz007 发表于 2022-10-6 21:31:21

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

      你不认为这样做会很被动吗,如果别人在 2 个字符串之间连续输入了 5 个空格你又准备怎么办?

正天圣人 发表于 2022-10-6 21:32:38

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

捡起5个空格就行了啊,不是有循环吗

jhq999 发表于 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',a1的不会从a开始链接

正天圣人 发表于 2022-10-6 21:40:35

jhq999 发表于 2022-10-6 21:37


char a,b='\0',a1="\0";
这一句已经定义了啊

jhq999 发表于 2022-10-6 21:41:23

正天圣人 发表于 2022-10-6 21:40
char a,b='\0',a1="\0";
这一句已经定义了啊

你没有初始化a

正天圣人 发表于 2022-10-6 21:44:32

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.)

正天圣人 发表于 2022-10-6 21:47:51

jhq999 发表于 2022-10-6 21:41
你没有初始化a

而且一开始调试台是这样显示的a = "\000\001\000\000\000\022\000\000\000d\"w\000h\377b\000\360\027@"

jhq999 发表于 2022-10-6 21:47:59

正天圣人 发表于 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:48:28

正天圣人 发表于 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:49:36

正天圣人 发表于 2022-10-6 21:48
这样就是初始化了啊

a为空啊
页: [1] 2
查看完整版本: 大佬们为什么c一直变啊