鱼C论坛

 找回密码
 立即注册
查看: 1479|回复: 2

[已解决]求助

[复制链接]
发表于 2023-4-6 23:28:28 | 显示全部楼层 |阅读模式

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

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

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







最佳答案
2023-4-6 23:37:12
本帖最后由 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-6 23:32:17 | 显示全部楼层

回帖奖励 +3 鱼币

在原程序中,1.是正确的,使用 getchar() 获取输入的字符,并且将其存储在字符数组 str 中,直至遇到换行符为止。2.是不可行的,因为它只判断了当前字符是否为空格,而没有判断之前的字符是否已经超过了字符数组的长度限制。如果使用它来截取字符串,则可能会导致访问越界或者截取的字符串不符合要求。

对于要求 B,你可以在读取并存储字符的过程中,记录最后一个空格的位置,然后在字符数组中加上 \0 终止符截取字符串,如下所示:
while ((ch = getchar()) != '\n') {
    str[i++] = ch;
    if (i == MAX - 1) {
        if (ch == ' ') {  // 如果刚好在空格处,直接截取
            str[i] = '\0';
        } else {  // 否则,从上一个空格处截取
            str[space] = '\0';
        }
        break;
    }
    if (ch == ' ') {
        space = i - 1;
    }
}
对于要求 C,如果在读取完所有字符之后,字符数组 str 的长度小于等于 MAX,则可以直接在末尾加上 \0 终止符。如果 str 的长度大于 MAX,则可以截取前 MAX-1 个字符并加上 \0 终止符。如下所示:
if (i < MAX) {
    str[i] = '\0';
} else {
    str[MAX - 1] = '\0';
}
注意,以上两个截取字符串的方法只能使用其中一个,在代码中添加 if-else 分支处理即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-6 23:37:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 09:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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