GuHx 发表于 2024-2-20 17:52:04

大佬们帮我看看为什么我这个代码达不到题目要求

本帖最后由 GuHx 于 2024-2-20 17:54 编辑

题目是:
1. 按下边要求写程序。
要求 A:定义一个长度为 21 的字符数组,用于存放用户输入的文本;
要求 B:如果用户输入的文本长度超过 20 个字符,且文本中存在空格,则截取至最接近末尾(第 20 个字符串)的空格;
要求 C:如果用户输入的文本长度超过 20 个字符,且文本中不存在空格,则打印前 20 个字符。

我的代码是:
#include <stdio.h>
#include <string.h>

int main()
{
      char a;
      int i=0,t=19;
      char b[]="你输入的文本是:";
      int flag=0;

      printf("请输入一行文本:");
      while((a= getchar()) != '\n'){
                ;
      }
      a=='\0';

      if(a=='\0'){
                strcat(b,a);
                printf("%s\n",b);
      }
      else if(a!='\0'){
                for(i=0;i<21;i++){
                        if(a==' '){
                              flag++;
                        }
                }
                if(!flag){
                        strncat(b,a,20);
                        printf("%s\n",b);
                }
                else{
                        for(t=19;a!=' ';t--){
                              sprintf(b,"%c",a);
                        }
                        printf("%s\n",b);
                }
      }
      return 0;
}


运行结果是:$ ./test1
请输入一行文本:FishC.com
你输入的文本是:FishC.com
@

//结果输出多一个@
另一种运行结果是:
$ ./test1
请输入一行文本:Hold on your hats. Ladie and gentlemen.
H
//结果很离谱了
还有一种结果是:
$ ./test1
请输入一行文本:HelloEveryone,I'mYourGoodFriend.
你输入的文本是:HelloEveryone,I'mYou
//唯一正常的

求大佬们帮孩子看看哪里错了,已经改了一下午了想不通{:10_266:}

FishC 发表于 2024-2-20 17:52:05

这是因为你的代码中存在一些逻辑错误和语法错误。

首先,在定义字符数组`char a;`时,你只定义了一个字符变量,而不是字符数组。要定义一个长度为21的字符数组,应该使用`char a;`。

其次,在使用`getchar()`获取用户输入时,你没有将输入的字符存储到数组中。你可以使用循环来逐个将字符存储到数组中。

另外,在判断用户输入的长度超过20个字符时,你使用了一个无意义的语句`a=='\0';`,这是一个比较操作,并不会对a产生任何影响。

最后,在使用字符串拼接函数`strcat()`时,你传递给它的参数类型错误。字符串在C语言中是用双引号表示的,而不是单引号。所以正确的写法应该是`char b[] = "你输入的文本是:";`。

根据题目要求,你可以参考下面的代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char a;
    int i, t = 19;
    char b[] = "你输入的文本是:";

    printf("请输入一行文本:");
    for (i = 0; i < t; i++) {
      a = getchar();
      if (a == '\n') {
            break;
      }
    }
    a = '\0';

    if (strlen(a) <= t) {
      strcat(b, a);
      printf("%s\n", b);
    } else {
      int last_space_index = -1;
      for (i = 0; i < t; i++) {
            if (a == ' ') {
                last_space_index = i;
            }
      }
      if (last_space_index != -1) {
            a = '\0';
            strcat(b, a);
            printf("%s\n", b);
      } else {
            for (i = 0; i < t; i++) {
                putchar(a);
            }
            putchar('\n');
      }
    }

    return 0;
}

这个代码首先定义了一个长度为21的字符数组`a`,用于存放用户输入的文本。接着使用循环逐个获取字符,并将其存储到数组中。当输入的字符为换行符时,循环结束。

然后根据字符串的长度进行判断。如果长度小于等于20,则直接拼接字符串并打印。如果长度超过20,则使用一个变量`last_space_index`记录最后一个空格的位置。如果存在空格,则截取至最接近末尾的空格,并拼接字符串打印。如果不存在空格,则打印前20个字符。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

GuHx 发表于 2024-2-20 19:58:26

#include <stdio.h>
#include <string.h>

int main()
{
      char a;
      int i=0,t=19;
      char b[]="你输入的文本是:";
      int flag=0;
      int count=0;

      printf("请输入一行文本:");
      while((a= getchar()) != '\n'){
                ;
      }
      a='\0';
      //差一个消除空行的做法

      if(a=='\0'){
                strcat(b,a);
                printf("%s",b);
      }
      else if(a!='\0'){
                for(i=0;i<21;i++){
                        if(a==' '){
                              flag++;
                        }
                }
                //printf("%d\n",flag);
                if(!flag){
                        strncat(b,a,20);
                        printf("%s\n",b);
                }
                else{
                        for(t=19;a!=' ';t--){
                              count++;
                        }
                        //printf("我%d\n",count);

                        for(i=0;i<20-count;i++){
                              sprintf(b,"%s%c",b,a);
                        }
                        printf("%s\n",b);
                }
      }

      return 0;
}
成功运行,但和标准答案一比像史一样长

FishC 发表于 2024-2-20 19:59:02

GuHx 发表于 2024-02-20 19:58
#include
#include

int main()
{
      cha ...

你的代码逻辑仍然存在一些问题。首先,在使用`getchar()`获取用户输入时,你把获取到的字符存储在变量`a`中,但是后面并没有将其放入字符数组`a`中。你需要通过索引将字符存储到数组中,如`a = a;`。其次,在判断字符数组是否为空时,你使用了`a == '\0'`,这是一个比较操作,并不会使`a`变为空。要将字符数组置为空,应该使用`a = '\0';`。此外,你使用了`strcat()`函数来拼接字符,但是拼接的方式不正确。因为你的目标字符串是一个字符,无法直接与字符数组拼接。你可以使用`printf()`函数来打印输出。最后,在循环遍历字符数组时,你没有处理空格的情况。根据题目要求,如果用户输入的文本长度超过20个字符,且文本中存在空格,则只截取到最接近末尾的空格。你可以在存储字符的循环中,判断是否到达20个字符,并且当前字符是否为空格,来决定是否结束循环。根据以上问题,下面是修正后的代码:#include #include int main(){    char a;    int i, t = 19;    char b[] = "你输入的文本是:";    printf("请输入一行文本:");    for (i = 0; i < t; i++) {      a = getchar();      if (a == ' ' && i > 0) {            break;      }    }    a = '\0';    if (strlen(a) <= 20) {      printf("%s%s\n", b, a);    } else {      printf("%s%s\n", b, a);    }    return 0;}这段代码首先定义了一个字符数组`a`,长度为21,用于存放用户输入的文本。然后定义了变量`i`和`t`,分别表示当前已存储的字符个数和最大存储空间。接下来使用`getchar()`函数循环获取用户输入的字符,并判断是否到达最大存储空间或遇到空格,决定是否结束循环。之后将字符数组末尾置为空字符,以便使用`strlen()`函数获取字符串长度。根据题目要求,判断字符串长度是否超过20个字符,并通过`printf()`函数打印输出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 大佬们帮我看看为什么我这个代码达不到题目要求