鱼C论坛

 找回密码
 立即注册
查看: 1792|回复: 9

[已解决]关于C语言字符串数组的问题。

[复制链接]
发表于 2017-4-11 16:52:09 | 显示全部楼层 |阅读模式

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

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

x
QQ截图20170411163442.jpg
1111111.jpg

如图,space记录了最后一个空格的位置,然后下面又把'\0'赋给str[space] ,这样,空格位置不是应该被结束符替换了吗?可我编译的结果空格却还存在?是我理解有误还是怎么回事?求大神指正~~
最佳答案
2017-4-11 17:49:18
row1990 发表于 2017-4-11 17:39
这是小甲鱼的题目。我就是搞不懂最后那个空格怎么来的,应该是被结束符替换掉吧……
我测试的输入是: ...
#include"stdio.h"
#include"string.h"

#define MAX 21

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

        space = MAX - 1;        //实际空间为20.

        printf("输入字符串:");
        while((ch = getchar()) != '\n')
        {
                //str[i++] = ch;  //将接受到的字符连续赋值给str[i++].
                str[i] = ch; 
                if(i == MAX - 1)
                {
                        break;  //到了字符数组最后一位,退出循环。
                }
                if(ch == ' ')
                {
                        space = i; //将最后一个空格的位置赋值给实际空间。
                }
                i++;
        }

        if(i >= MAX - 1)
        {
                str[space] = '\0';
        }
        else
        {
                str[i] = '\0';
        }
        printf("你输入的是:%s\n", str);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-11 17:18:30 | 显示全部楼层
我不建议你把代码写成那样
我写了一个
如果你执意要找你代码中的问题,把代码贴上来
#include <stdio.h>

#define MAX 21

int main(void)
{
        char str[MAX];
        int str_i = 0;
        int ch;

        printf("请输入一行文本:");
        while((ch = getchar()) != '\n')
        {
                str[str_i++] = ch;
        }
        str[str_i++] = '\0';

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

        return 0;
}
请输入一行文本:123 456 789
你输入的文本是:123 456 789
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 17:24:55 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-11 17:39:13 | 显示全部楼层
人造人 发表于 2017-4-11 17:18
我不建议你把代码写成那样
我写了一个
如果你执意要找你代码中的问题,把代码贴上来
#include"stdio.h"
#include"string.h"

#define MAX 21

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

        space = MAX - 1;        //实际空间为20.

        printf("输入字符串:");
        while((ch = getchar()) != '\n')
        {
                str[i++] = ch;  //将接受到的字符连续赋值给str[i++].
                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;
}
这是小甲鱼的题目。我就是搞不懂最后那个空格怎么来的,应该是被结束符替换掉吧……
我测试的输入是:aaaaaaaaaa aaaaaaaaaa
1. 按下边要求写程序。
要求 A:定义一个长度为 21 的字符数组,用于存放用户输入的文本;
要求 B:如果用户输入的文本长度超过 20 个字符,且文本中存在空格,则截取至最接近末尾(第 20 个字符串)的空格;
要求 C:如果用户输入的文本长度超过 20 个字符,且文本中不存在空格,则打印前 20 个字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 17:49:18 | 显示全部楼层    本楼为最佳答案   
row1990 发表于 2017-4-11 17:39
这是小甲鱼的题目。我就是搞不懂最后那个空格怎么来的,应该是被结束符替换掉吧……
我测试的输入是: ...
#include"stdio.h"
#include"string.h"

#define MAX 21

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

        space = MAX - 1;        //实际空间为20.

        printf("输入字符串:");
        while((ch = getchar()) != '\n')
        {
                //str[i++] = ch;  //将接受到的字符连续赋值给str[i++].
                str[i] = ch; 
                if(i == MAX - 1)
                {
                        break;  //到了字符数组最后一位,退出循环。
                }
                if(ch == ' ')
                {
                        space = i; //将最后一个空格的位置赋值给实际空间。
                }
                i++;
        }

        if(i >= MAX - 1)
        {
                str[space] = '\0';
        }
        else
        {
                str[i] = '\0';
        }
        printf("你输入的是:%s\n", str);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 19:47:01 From FishC Mobile | 显示全部楼层
最后加多一个'\0'是为了让内存识别到字符串已经结束,并不是空格,真正的空格是'\32',你对照一下ASCII码表就能看出来,字符串在内存中都会比实际长度多一个字节用于作为结束符,你学到后边用malloc动态分配内存空间你就要注意这点,不然会报内存越界的错误

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
row1990 + 1 + 1 + 1 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-12 12:31:30 | 显示全部楼层
lumber2388779 发表于 2017-4-11 19:47
最后加多一个'\0'是为了让内存识别到字符串已经结束,并不是空格,真正的空格是'\32',你对照一下ASCII码表 ...

多谢提醒,这个我知道的。我就是搞不懂上面已经把‘\0’赋给空格的位置了,编译出来却多出一个空格。

这几天比较忙,还没时间编译看看是什么情况……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-12 13:12:23 | 显示全部楼层
代码没问题,你也没理解错误!关键在于控制台输出格式的问题!应为你是中文系统
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-12 15:09:39 | 显示全部楼层
聆云 发表于 2017-4-12 13:12
代码没问题,你也没理解错误!关键在于控制台输出格式的问题!应为你是中文系统

我用的是虚拟机linux英文系统~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-12 15:13:27 | 显示全部楼层
聆云 发表于 2017-4-12 13:12
代码没问题,你也没理解错误!关键在于控制台输出格式的问题!应为你是中文系统

没理解错误就行,我以为str[space]原先存储的不是空格而'\0'没有赋值给空格的位置呢,是就好,毕竟还不是很熟练。
有空再编译看看具体啥情况……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 03:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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