鱼C论坛

 找回密码
 立即注册
查看: 231|回复: 3

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

[复制链接]
发表于 2024-2-20 17:52:04 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 GuHx 于 2024-2-20 17:54 编辑

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

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

  3. int main()
  4. {
  5.         char a[21];
  6.         int i=0,t=19;
  7.         char b[]="你输入的文本是:";
  8.         int flag=0;

  9.         printf("请输入一行文本:");
  10.         while((a[i++]= getchar()) != '\n'){
  11.                 ;
  12.         }
  13.         a[i]=='\0';

  14.         if(a[19]=='\0'){
  15.                 strcat(b,a);
  16.                 printf("%s\n",b);
  17.         }
  18.         else if(a[19]!='\0'){
  19.                 for(i=0;i<21;i++){
  20.                         if(a[i]==' '){
  21.                                 flag++;
  22.                         }
  23.                 }
  24.                 if(!flag){
  25.                         strncat(b,a,20);
  26.                         printf("%s\n",b);
  27.                 }
  28.                 else{
  29.                         for(t=19;a[t]!=' ';t--){
  30.                                 sprintf(b,"%c",a[19-t]);
  31.                         }
  32.                         printf("%s\n",b);
  33.                 }
  34.         }
  35.         return 0;
  36. }
复制代码


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

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

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

最佳答案
2024-2-20 17:52:05
这是因为你的代码中存在一些逻辑错误和语法错误。

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

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

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

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

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

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

  3. int main()
  4. {
  5.     char a[21];
  6.     int i, t = 19;
  7.     char b[] = "你输入的文本是:";

  8.     printf("请输入一行文本:");
  9.     for (i = 0; i < t; i++) {
  10.         a[i] = getchar();
  11.         if (a[i] == '\n') {
  12.             break;
  13.         }
  14.     }
  15.     a[i] = '\0';

  16.     if (strlen(a) <= t) {
  17.         strcat(b, a);
  18.         printf("%s\n", b);
  19.     } else {
  20.         int last_space_index = -1;
  21.         for (i = 0; i < t; i++) {
  22.             if (a[i] == ' ') {
  23.                 last_space_index = i;
  24.             }
  25.         }
  26.         if (last_space_index != -1) {
  27.             a[last_space_index] = '\0';
  28.             strcat(b, a);
  29.             printf("%s\n", b);
  30.         } else {
  31.             for (i = 0; i < t; i++) {
  32.                 putchar(a[i]);
  33.             }
  34.             putchar('\n');
  35.         }
  36.     }

  37.     return 0;
  38. }
复制代码


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

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

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

最佳答案

查看完整内容

这是因为你的代码中存在一些逻辑错误和语法错误。 首先,在定义字符数组`char a;`时,你只定义了一个字符变量,而不是字符数组。要定义一个长度为21的字符数组,应该使用`char a[21];`。 其次,在使用`getchar()`获取用户输入时,你没有将输入的字符存储到数组中。你可以使用循环来逐个将字符存储到数组中。 另外,在判断用户输入的长度超过20个字符时,你使用了一个无意义的语句`a=='\0';`,这是一个比较操作,并不会对a ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-20 17:52:05 | 显示全部楼层    本楼为最佳答案   
这是因为你的代码中存在一些逻辑错误和语法错误。

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

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

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

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

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

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

  3. int main()
  4. {
  5.     char a[21];
  6.     int i, t = 19;
  7.     char b[] = "你输入的文本是:";

  8.     printf("请输入一行文本:");
  9.     for (i = 0; i < t; i++) {
  10.         a[i] = getchar();
  11.         if (a[i] == '\n') {
  12.             break;
  13.         }
  14.     }
  15.     a[i] = '\0';

  16.     if (strlen(a) <= t) {
  17.         strcat(b, a);
  18.         printf("%s\n", b);
  19.     } else {
  20.         int last_space_index = -1;
  21.         for (i = 0; i < t; i++) {
  22.             if (a[i] == ' ') {
  23.                 last_space_index = i;
  24.             }
  25.         }
  26.         if (last_space_index != -1) {
  27.             a[last_space_index] = '\0';
  28.             strcat(b, a);
  29.             printf("%s\n", b);
  30.         } else {
  31.             for (i = 0; i < t; i++) {
  32.                 putchar(a[i]);
  33.             }
  34.             putchar('\n');
  35.         }
  36.     }

  37.     return 0;
  38. }
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-2-20 19:58:26 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.         char a[100];
  6.         int i=0,t=19;
  7.         char b[]="你输入的文本是:";
  8.         int flag=0;
  9.         int count=0;

  10.         printf("请输入一行文本:");
  11.         while((a[i++]= getchar()) != '\n'){
  12.                 ;
  13.         }
  14.         a[i]='\0';
  15.         //差一个消除空行的做法

  16.         if(a[19]=='\0'){
  17.                 strcat(b,a);
  18.                 printf("%s",b);
  19.         }
  20.         else if(a[19]!='\0'){
  21.                 for(i=0;i<21;i++){
  22.                         if(a[i]==' '){
  23.                                 flag++;
  24.                         }
  25.                 }
  26.                 //printf("%d\n",flag);
  27.                 if(!flag){
  28.                         strncat(b,a,20);
  29.                         printf("%s\n",b);
  30.                 }
  31.                 else{
  32.                         for(t=19;a[t]!=' ';t--){
  33.                                 count++;
  34.                         }
  35.                         //printf("我%d\n",count);

  36.                         for(i=0;i<20-count;i++){
  37.                                 sprintf(b,"%s%c",b,a[i]);
  38.                         }
  39.                         printf("%s\n",b);
  40.                 }
  41.         }

  42.         return 0;
  43. }
复制代码
成功运行,但和标准答案一比像史一样长
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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] = '\0';`。此外,你使用了`strcat()`函数来拼接字符,但是拼接的方式不正确。因为你的目标字符串是一个字符,无法直接与字符数组拼接。你可以使用`printf()`函数来打印输出。最后,在循环遍历字符数组时,你没有处理空格的情况。根据题目要求,如果用户输入的文本长度超过20个字符,且文本中存在空格,则只截取到最接近末尾的空格。你可以在存储字符的循环中,判断是否到达20个字符,并且当前字符是否为空格,来决定是否结束循环。根据以上问题,下面是修正后的代码:#include #include int main(){    char a[21];    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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 19:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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