鱼C论坛

 找回密码
 立即注册
查看: 1728|回复: 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
这是小甲鱼的题目。我就是搞不懂最后那个空格怎么来的,应该是被结束符替换掉吧……
我测试的输入是: ...
  1. #include"stdio.h"
  2. #include"string.h"

  3. #define MAX 21

  4. int main()
  5. {
  6.         int ch, space, i = 0;
  7.         char str[MAX];

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

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

  24.         if(i >= MAX - 1)
  25.         {
  26.                 str[space] = '\0';
  27.         }
  28.         else
  29.         {
  30.                 str[i] = '\0';
  31.         }
  32.         printf("你输入的是:%s\n", str);

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

使用道具 举报

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

  1. #include <stdio.h>

  2. #define MAX 21

  3. int main(void)
  4. {
  5.         char str[MAX];
  6.         int str_i = 0;
  7.         int ch;

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

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

  15.         return 0;
  16. }
复制代码

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

使用道具 举报

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

使用道具 举报

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

  3. #define MAX 21

  4. int main()
  5. {
  6.         int ch, space, i = 0;
  7.         char str[MAX];

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

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

  22.         if(i >= MAX - 1)
  23.         {
  24.                 str[space] = '\0';
  25.         }
  26.         else
  27.         {
  28.                 str[i] = '\0';
  29.         }
  30.         printf("你输入的是:%s\n",str);

  31.         return 0;
  32. }
复制代码

这是小甲鱼的题目。我就是搞不懂最后那个空格怎么来的,应该是被结束符替换掉吧……
我测试的输入是: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
这是小甲鱼的题目。我就是搞不懂最后那个空格怎么来的,应该是被结束符替换掉吧……
我测试的输入是: ...
  1. #include"stdio.h"
  2. #include"string.h"

  3. #define MAX 21

  4. int main()
  5. {
  6.         int ch, space, i = 0;
  7.         char str[MAX];

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

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

  24.         if(i >= MAX - 1)
  25.         {
  26.                 str[space] = '\0';
  27.         }
  28.         else
  29.         {
  30.                 str[i] = '\0';
  31.         }
  32.         printf("你输入的是:%s\n", str);

  33.         return 0;
  34. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-5-21 00:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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