鱼C论坛

 找回密码
 立即注册
查看: 616|回复: 10

[已解决]字符串答案疑惑

[复制链接]
发表于 2023-12-1 19:44:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

#define MAX 21 // 包含结束符就是21个字符

int main()
{
        int ch, space, i = 0;
        char str[MAX];

        space = MAX - 1;

        printf("请输入一行文本:");
        while ((ch = getchar()) != '\n')
        {
                str[i++] = ch;
                if (i == MAX - 1)
                {
                        break; // 到了字符数组最后一个位置
                }
                if (ch == ' ')
                {
                        space = i; // 记录最后一个空格的位置
                }
        }

        if (i >= MAX - 1)
        {
                str[space] = '\0';
        }
        else
        {
                str[i] = '\0';
        }

        printf("你输入的文本是:%s\n", str);

        return 0;
}
字符串练习答案我不太懂,第14的ch不是int类型吗,怎么直接把getchar()赋值给ch了?

最佳答案
2023-12-1 19:56:32
getchar()函数的返回类型是int,原因是除了能返回读取的字符外,还需要返回一个特殊的值EOF(End of File),用来表示读取结束。

在这个程序中,getchar()从标准输入(通常是键盘)读取一个字符,然后返回这个字符的ASCII码,所以可以赋值给int型变量ch。在第15行,ch被再次使用之前,它被强制转换为char类型,这是因为ASCII码是字符集合的一部分。


有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-1 19:44:48 | 显示全部楼层
在C语言中,`getchar()`函数的返回值类型是`int`,它可以返回任何`unsigned char`或者`EOF`(通常是-1)。所以在第14行,将`getchar()`的返回值直接赋给`ch`是合法的。

`ch`被声明为`int`类型是因为`getchar()`可以返回`EOF`,而`EOF`是一个特殊的整数值(通常是-1),用来表示输入流的末尾。通过将`ch`声明为`int`类型,可以确保能够正确地接收和处理输入流的所有字符,包括正常字符和`EOF`。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-1 19:48:44 | 显示全部楼层
那该代码的第14行有什么用?能不能解释一下整个代码是怎么实现的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 19:49:07 | 显示全部楼层
西西55 发表于 2023-12-01 19:48
那该代码的第14行有什么用?能不能解释一下整个代码是 ...

这段代码的功能是读取用户输入的一行文本,并将其存储在字符数组 `str` 中。这里是对整个代码的解释:

1. 定义了一个常量 `MAX`,它表示字符串数组 `str` 的最大长度,包括结束符。
2. 声明了变量 `ch` 用于存储从输入流中获取的字符,`space` 表示最后一个空格的位置,`i` 用于记录字符数组 `str` 的当前位置。
3. 初始化 `space` 为 `MAX - 1`,即假设最初没有空格。
4. 提示用户输入一行文本。
5. 使用 `while` 循环读取每个字符,直到遇到换行符 `\n`。
6. 将当前字符赋值给变量 `ch`。
7. 如果已经到达字符串数组 `str` 的最后一个位置(`i == MAX - 1`),则跳出循环。
8. 如果当前字符是空格,则更新 `space` 的值为当前位置 `i`。
9. 如果循环结束时 `i` 大于或等于 `MAX - 1`,说明用户输入的文本超过了字符数组的最大长度,将最后一个字符设置为结束符 `\0`。
10. 否则,将最后一个字符设置为结束符 `\0`。
11. 打印用户输入的文本字符串。

需要注意的是,这段代码并没有正确地将用户输入的文本存储到字符数组 `str` 中,因为在循环中只是将每个字符依次赋值给了变量 `str`,而不是将它们添加到字符串末尾。正确的做法是将字符添加到 `str` 的位置,并在最后设置结束符。下面是一个修正后的代码示例:
  1. #include <stdio.h>
  2. #define MAX 21 // 包含结束符就是21个字符
  3. int main() {
  4.     int ch, space, i = 0;
  5.     char str[MAX]; // 字符数组
  6.    
  7.     space = MAX - 1;
  8.    
  9.     printf("请输入一行文本:");
  10.    
  11.     while ((ch = getchar()) != '\n') {
  12.         if (i == MAX - 1) {
  13.             break; // 到了字符数组最后一个位置
  14.         }
  15.         
  16.         if (ch == ' ') {
  17.             space = i; // 记录最后一个空格的位置
  18.         }
  19.         str[i++] = ch; // 将字符添加到字符数组中,并使 i 自增
  20.     }
  21.    
  22.     if (i >= MAX - 1) {
  23.         str[MAX - 1] = '\0'; // 输入超过了字符数组的最大长度
  24.     } else {
  25.         str[i] = '\0'; // 正常输入,设置结束符
  26.     }
  27.    
  28.     printf("你输入的文本是:%s\n", str);
  29.    
  30.     return 0;
  31. }
复制代码

这段修正后的代码会将用户输入的文本存储在字符数组 `str` 中,并正确地处理了长度超过最大长度的情况。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-1 19:54:17 | 显示全部楼层
FishC_GPT 发表于 2023-12-1 19:44
在C语言中,`getchar()`函数的返回值类型是`int`,它可以返回任何`unsigned char`或者`EOF`(通常是-1)。 ...

我还是不懂为什么能写成:ch = getchar()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 19:54:27 | 显示全部楼层
西西55 发表于 2023-12-01 19:54
我还是不懂为什么能写成:ch = getchar()

`ch = getchar()`这行代码是将`getchar()`函数的返回值赋给变量`ch`。在C语言中,函数的返回值可以直接赋值给一个变量。

`getchar()`函数的返回值类型是`int`,因此可以将它赋给一个`int`类型的变量,如`ch`。这样做的好处是可以接收和处理输入流的所有字符,包括正常字符和特殊字符(例如`EOF`)。

换句话说,`getchar()`函数返回一次从标准输入读取的一个字符,并且将该字符作为`int`类型返回。然后,通过将这个返回值赋给`ch`,我们将它存储在一个变量中以便之后使用。

希望这样解释能够帮助您理解这个问题。如果还有其他问题,请随时提问。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 19:56:32 | 显示全部楼层    本楼为最佳答案   
getchar()函数的返回类型是int,原因是除了能返回读取的字符外,还需要返回一个特殊的值EOF(End of File),用来表示读取结束。

在这个程序中,getchar()从标准输入(通常是键盘)读取一个字符,然后返回这个字符的ASCII码,所以可以赋值给int型变量ch。在第15行,ch被再次使用之前,它被强制转换为char类型,这是因为ASCII码是字符集合的一部分。


有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-1 19:57:27 | 显示全部楼层
FishC_GPT 发表于 2023-12-1 19:54
`ch = getchar()`这行代码是将`getchar()`函数的返回值赋给变量`ch`。在C语言中,函数的返回值可以直接赋 ...

意思是说把getchar()得到的char的ASCII码存储在ch中吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 19:57:41 | 显示全部楼层
西西55 发表于 2023-12-01 19:57
意思是说把getchar()得到的char的ASCII码存储在ch中吗 ...

是的,`getchar()`函数从输入流中读取一个字符,并将其作为`int`类型的ASCII码返回。ASCII码是一种用来表示字符的编码方式,每个字符都对应一个唯一的ASCII码值。当我们将`getchar()`的返回值赋给`int`类型的变量`ch`时,实际上就是将读取到的字符的ASCII码存储在了`ch`中。这样做的好处是可以使用整数进行字符的比较、运算和处理,而不仅仅局限于字符的直接展示。需要注意的是,虽然`ch`是`int`类型,但它只存储一个字符的ASCII码值,并不表示一个整数。希望这样解释能够明确您的疑问。如果还有其他问题,请随时提问。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-1 20:22:45 | 显示全部楼层
FishC_GPT 发表于 2023-12-1 19:49
这段代码的功能是读取用户输入的一行文本,并将其存储在字符数组 `str` 中。这里是对整个代码的解释:

1 ...

该代码的i不是只能最大为20吗?为什么第25行还要 if (i >= MAX - 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 20:22:59 | 显示全部楼层
西西55 发表于 2023-12-01 20:22
该代码的i不是只能最大为20吗?为什么第25行还要 if ( ...

你是对的,这段代码中的 `i` 的最大值应该是 `MAX - 1`,即字符数组 `str` 的长度减去 1。因此,在第25行的判断条件应该为 `if (i >= MAX - 1)` 而不是 `if (i > MAX - 1)`,这样才能正确处理输入字符长度等于最大长度的情况。感谢你的指正!

修正后的代码示例:
  1. #include <stdio.h>
  2. #define MAX 21 // 包含结束符就是21个字符
  3. int main() {
  4.     int ch, space, i = 0;
  5.     char str[MAX]; // 字符数组
  6.     space = MAX - 1;
  7.     printf("请输入一行文本:");
  8.     while ((ch = getchar()) != '\n') {
  9.         if (i == MAX - 1) { // 到了字符数组最后一个位置
  10.             break;
  11.         }
  12.         if (ch == ' ') {
  13.             space = i; // 记录最后一个空格的位置
  14.         }
  15.         str[i++] = ch; // 将字符添加到字符数组中,并使 i 自增
  16.     }
  17.     if (i >= MAX - 1) {
  18.         str[MAX - 1] = '\0'; // 输入超过了字符数组的最大长度
  19.     } else {
  20.         str[i] = '\0'; // 正常输入,设置结束符
  21.     }
  22.     printf("你输入的文本是:%s\n", str);
  23.     return 0;
  24. }
复制代码

这样修改后的代码可以正确地将用户输入的文本存储在字符数组 `str` 中,并且处理了输入长度超过最大长度的情况。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 11:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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