求助
#include <stdio.h>#include <string.h>
#define MAX 21 // 包含结束符就是21个字符 //程序要求 : 要求 A:定义一个长度为 21 的字符数组,用于存放用户输入的文本;PMrek&
要求 B:如果用户输入的文本长度超过 20 个字符,且文本中存在空格,则截取至最接近末尾(第 20 个字符串)的空格;
要求 C:如果用户输入的文本长度超过 20 个字符,且文本中不存在空格,则打印前 20 个字符
int main()
{
int ch, space, i = 0;
char str;
space = MAX - 1;
printf("请输入一行文本:");
1. while ((ch = getchar()) != '\n') 1. /*为什么不能替换成((str=getchar())!='\n')
{
str = ch;
if (i == MAX - 1)
{
break; // 到了字符数组最后一个位置
}
2. if (ch == ' ') 2. if( str==' ');*/
{
space = i; // 记录最后一个空格的位置
} 替换这两项之后,为什么无法实现要求B,求解;
}
if (i >= MAX - 1)
{
str = '\0';
}
else
{
str = '\0';
}
printf("你输入的文本是:%s\n", str);
printf("%c",str);
return 0;
}
在原程序中,1.是正确的,使用 getchar() 获取输入的字符,并且将其存储在字符数组 str 中,直至遇到换行符为止。2.是不可行的,因为它只判断了当前字符是否为空格,而没有判断之前的字符是否已经超过了字符数组的长度限制。如果使用它来截取字符串,则可能会导致访问越界或者截取的字符串不符合要求。
对于要求 B,你可以在读取并存储字符的过程中,记录最后一个空格的位置,然后在字符数组中加上 \0 终止符截取字符串,如下所示:
while ((ch = getchar()) != '\n') {
str = ch;
if (i == MAX - 1) {
if (ch == ' ') {// 如果刚好在空格处,直接截取
str = '\0';
} else {// 否则,从上一个空格处截取
str = '\0';
}
break;
}
if (ch == ' ') {
space = i - 1;
}
}
对于要求 C,如果在读取完所有字符之后,字符数组 str 的长度小于等于 MAX,则可以直接在末尾加上 \0 终止符。如果 str 的长度大于 MAX,则可以截取前 MAX-1 个字符并加上 \0 终止符。如下所示:
if (i < MAX) {
str = '\0';
} else {
str = '\0';
}
注意,以上两个截取字符串的方法只能使用其中一个,在代码中添加 if-else 分支处理即可。 本帖最后由 isdkz 于 2023-4-6 23:38 编辑
首先,我会解释程序中的两个关键点,然后解释为什么直接替换这两个关键点无法实现要求B。
1、为什么不能替换成((str=getchar())!='\n')
在原程序中,while循环有以下语句:
while ((ch = getchar()) != '\n')
{
str = ch;
...
}
你想将其替换为:
while ((str = getchar()) != '\n')
{
...
}
原程序中,ch变量的作用是保存用户输入的字符,然后将ch赋值给str]。
在你的修改中,你试图将getchar()的返回值直接赋值给str],然后检查是否等于'\n'。
这样做的问题在于:在执行str = getchar()时,i已经增加了1,所以在接下来的循环中,i的值会比实际存储的字符数量大1。
为了解决这个问题,你可以这样修改:
while ((str = getchar()) != '\n')
{
i++;
...
}
2、为什么替换成 if (str[i] == ' ') 无法实现要求B
原程序中,if语句如下:
if (ch == ' ')
{
space = i;
}
你想将其替换为:
if (str == ' ')
{
space = i;
}
问题在于,你需要检查已经保存到str数组中的字符,而不是当前的i。要实现这一点,你应该检查str,
因为在之前的修改中,我们已经将getchar()的返回值直接赋值给了str[i],然后增加了i。
所以,在这个点上,str]还没有被赋值,实际上你需要检查的是str。
修改后的代码如下:
while ((str = getchar()) != '\n')
{
i++;
if (i == MAX - 1)
{
break; // 到了字符数组最后一个位置
}
if (str == ' ')
{
space = i - 1; // 记录最后一个空格的位置
}
}
这样修改之后,程序应该可以满足要求B。
页:
[1]