所想如期而遇 发表于 2023-4-6 23:28:28

求助

#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;
}







歌者文明清理员 发表于 2023-4-6 23:32:17

在原程序中,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:37:12

本帖最后由 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]
查看完整版本: 求助