鱼C论坛

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

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

[复制链接]
发表于 2024-2-20 17:52:04 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 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[21];
        int i=0,t=19;
        char b[]="你输入的文本是:";
        int flag=0;

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

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

运行结果是:[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[] = "你输入的文本是:";`。

根据题目要求,你可以参考下面的代码:
#include <stdio.h>
#include <string.h>

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

    printf("请输入一行文本:");
    for (i = 0; i < t; i++) {
        a[i] = getchar();
        if (a[i] == '\n') {
            break;
        }
    }
    a[i] = '\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[i] == ' ') {
                last_space_index = i;
            }
        }
        if (last_space_index != -1) {
            a[last_space_index] = '\0';
            strcat(b, a);
            printf("%s\n", b);
        } else {
            for (i = 0; i < t; i++) {
                putchar(a[i]);
            }
            putchar('\n');
        }
    }

    return 0;
}

这个代码首先定义了一个长度为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[] = "你输入的文本是:";`。

根据题目要求,你可以参考下面的代码:
#include <stdio.h>
#include <string.h>

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

    printf("请输入一行文本:");
    for (i = 0; i < t; i++) {
        a[i] = getchar();
        if (a[i] == '\n') {
            break;
        }
    }
    a[i] = '\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[i] == ' ') {
                last_space_index = i;
            }
        }
        if (last_space_index != -1) {
            a[last_space_index] = '\0';
            strcat(b, a);
            printf("%s\n", b);
        } else {
            for (i = 0; i < t; i++) {
                putchar(a[i]);
            }
            putchar('\n');
        }
    }

    return 0;
}

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

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

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

使用道具 举报

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

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

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

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

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

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

使用道具 举报

发表于 2024-2-20 19:59:02 | 显示全部楼层
GuHx 发表于 2024-02-20 19:58
#include
#include

int main()
{
        cha ...


你的代码逻辑仍然存在一些问题。首先,在使用`getchar()`获取用户输入时,你把获取到的字符存储在变量`a`中,但是后面并没有将其放入字符数组`a`中。你需要通过索引将字符存储到数组中,如`a[i] = 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[i] = getchar();        if (a[i] == ' ' && i > 0) {            break;        }    }    a[i] = '\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-12-22 19:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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