|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#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[MAX];
space = MAX - 1;
printf("请输入一行文本:");
1. while ((ch = getchar()) != '\n') 1. /*为什么不能替换成((str[i++]=getchar())!='\n')
{
str[i++] = ch;
if (i == MAX - 1)
{
break; // 到了字符数组最后一个位置
}
2. if (ch == ' ') 2. if( str[i]==' '); */
{
space = i; // 记录最后一个空格的位置
} 替换这两项之后,为什么无法实现要求B,求解;
}
if (i >= MAX - 1)
{
str[space] = '\0';
}
else
{
str[i] = '\0';
}
printf("你输入的文本是:%s\n", str);
printf("%c",str[0]);
return 0;
}
本帖最后由 isdkz 于 2023-4-6 23:38 编辑
首先,我会解释程序中的两个关键点,然后解释为什么直接替换这两个关键点无法实现要求B。
1、为什么不能替换成((str[i++]=getchar())!='\n')
在原程序中,while循环有以下语句:
- while ((ch = getchar()) != '\n')
- {
- str[i++] = ch;
- ...
- }
复制代码
你想将其替换为:
- while ((str[i++] = getchar()) != '\n')
- {
- ...
- }
复制代码
原程序中,ch变量的作用是保存用户输入的字符,然后将ch赋值给str[i]。
在你的修改中,你试图将getchar()的返回值直接赋值给str[i],然后检查是否等于'\n'。
这样做的问题在于:在执行str[i++] = getchar()时,i已经增加了1,所以在接下来的循环中,i的值会比实际存储的字符数量大1。
为了解决这个问题,你可以这样修改:
- while ((str[i] = getchar()) != '\n')
- {
- i++;
- ...
- }
复制代码
2、为什么替换成 if (str[i] == ' ') 无法实现要求B
原程序中,if语句如下:
- if (ch == ' ')
- {
- space = i;
- }
复制代码
你想将其替换为:
- if (str[i] == ' ')
- {
- space = i;
- }
复制代码
问题在于,你需要检查已经保存到str数组中的字符,而不是当前的i。要实现这一点,你应该检查str[i - 1],
因为在之前的修改中,我们已经将getchar()的返回值直接赋值给了str[i],然后增加了i。
所以,在这个点上,str[i]还没有被赋值,实际上你需要检查的是str[i - 1]。
修改后的代码如下:
- while ((str[i] = getchar()) != '\n')
- {
- i++;
- if (i == MAX - 1)
- {
- break; // 到了字符数组最后一个位置
- }
- if (str[i - 1] == ' ')
- {
- space = i - 1; // 记录最后一个空格的位置
- }
- }
复制代码
这样修改之后,程序应该可以满足要求B。
|
|