一个小程序,大侠们看下结果为何不一样

时间:2023-01-19 20:39:46
在linux下编写了一个简单小程序查看getchar()吃回车的情况,发现了个小问题,希望各位指点下

程序如下:  #include<stdio.h>
            int main()
            {
                   char c[5],b[5];
                   int i;
                   for(i=0;i<10;i++)
                       {
                           c[i]=getchar();
                           getchar();
                           b[i]=getchar();
                           getchar();
                        }
                    printf{“c[5]=%s”,c);
                      printf("\n");
                    printf{“b[5]=%s”,b);
                      printf("\n");
                  return 0;
             }


运行后输入: a
             b
             c
             d
             e
             f
             g
             h
             i
             j
              
执行后结果:c[5]=acegic
            b[5]=bdfhj      本以为输入错误,结果多次运行结果一样          
 

问题就在于c[5]的最后一个值c是怎么来的啊                 


还有谁能顺便说下怎么插入本地图片啊

                
                
              

30 个解决方案

#1


不知道哦~~~~~

#2


越界了,出现期望中的结果是有可能的,也有可能出现其它结果。
环境能保证你的代码在“良好”的时候,有“预料中”的结果。
但是并不是说在代码“差”的时候,结果就不在预料中了。
当“差”代码的结果在预料中的时候,不要试图为这个作出解释,一切皆有可能。
你需要记住的是:写好的代码。

#3


越界。。。

#4


我晕   数组越界 

#5


引用 2 楼 baihacker 的回复:
越界了,出现期望中的结果是有可能的,也有可能出现其它结果。
环境能保证你的代码在“良好”的时候,有“预料中”的结果。
但是并不是说在代码“差”的时候,结果就不在预料中了。
当“差”代码的结果在预料中的时候,不要试图为这个作出解释,一切皆有可能。
你需要记住的是:写好的代码。
每次运行不是重新非配地址吗,为何c[5]后每次都是c,而不是其他的,b[5]为何没有类似情况呢

#6


引用 5 楼 yangling_t_r 的回复:
引用 2 楼 baihacker 的回复:
越界了,出现期望中的结果是有可能的,也有可能出现其它结果。
环境能保证你的代码在“良好”的时候,有“预料中”的结果。
但是并不是说在代码“差”的时候,结果就不在预料中了。
当“差”代码的结果在预料中的时候,不要试图为这个作出解释,一切皆有可能。
你需要记住的是:写好的代码。
每次运行不是重新非配地址吗,为何c[5]后每次都是c,而不是其他的,……

别去解释。。。
一定要解释的话,就是在特定环境,指定环境,由于某些原因,导致了这个。
但是并不能保证你环境变了,还有这些。

#7


因为没空字符结尾,而且你的数据不能够全部被放入到数组中作为字符串,而是作为了字符,我最近也是碰到了这样类似的问题,我也用数据做了几次测试:
发现输入的数据<=数组的长度*2,否则就出现了错误,至于原因,应该就是大于了2*数组长度了,导致数据不能被存放,也就是越界了。
 输出也只能是2*数组长度大小的字符。

#8


越界。。。。到了c的范围外面。。。

#9


= =我看不懂你这个循环是什么意思

#10


引用 9 楼 a328240784 的回复:
= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取

#11


引用 10 楼 goolloo 的回复:
引用 9 楼 a328240784 的回复:

= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取
那你们说的越界是什么意思?我自己脑子运行的是没有最后那个c的

#12


引用 11 楼 a328240784 的回复:
引用 10 楼 goolloo 的回复:
引用 9 楼 a328240784 的回复:

= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取
那你们说的越界是什么意思?我自己脑子运行的是没有最后那个c的

越界就是c[4]范围应该是从c开始四个int型长度的范围,但是他读出的时候没有'\0'或者NULL、EOF标志,就沿着地址继续读下去了,就超出c[]的范围了

其实他的程序理论上应该输入20个字符的,我也不知道他怎么弄的

#13


很明显  楼上越界了   没什么关系啦  新手  以后会好的

#14


这代码写的,楼主还是重新实现一下吧~

#15


引用 12 楼 goolloo 的回复:
引用 11 楼 a328240784 的回复:
引用 10 楼 goolloo 的回复:
引用 9 楼 a328240784 的回复:

= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取
那你们说的越界是什么意思?我自己脑子运行的是没有最后那个c的

越界就是c[4]范围应该是从c开始四个……

为什么说应该要输入20个呢,定义的是数组大小是5啊,2个数组不是输入10个吗,能说说嘛

#16


程序语法和逻辑都没问题,就是最后的输出方式不对,a b都是字符数组, 不是字符串,不能用%s输出,你知道\0在哪里呢?前五个字符不是都正常输出了嘛,后面输出什么都可能。 

#17


引用 15 楼 yangling_t_r 的回复:
引用 12 楼 goolloo 的回复:
引用 11 楼 a328240784 的回复:
引用 10 楼 goolloo 的回复:
引用 9 楼 a328240784 的回复:

= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取
那你们说的越界是什么意思?我自己脑子运行的是没有最后那个c的
……

你的循环是i<10,一个循环是输入两次,,,,,,

我觉得还是推翻重来比较好。。。这个问题还是蛮多的。。。

建议你在格式、风格上能有一些“标准化”

the elements of c++ style 可以看看,我其实以前比你还乱,现在在努力改正!
加油吧!

#18


感觉怎么跟以前的我一样专牛角尖...

#19


谢谢大家了,祝新年快乐

#20


越界。。。。到了c的范围外面。。。

#21


一个小程序,大侠们看下结果为何不一样一经3L提醒 我才发现
  printf{“c[5]=%s”,c);
  printf("\n");
  printf{“b[5]=%s”,b);
  printf("\n");

这里越界了

#22


当printf()的格式字符串是%S时,打印直到遇到'\0',结束
楼主在打印前stop,查看数组中的内容

#23


你要存5个字符就定义长度为6个的字符数组,系统会自动在最后给你加个\0 或者输出时用%c

#24


该回复于2011-02-09 10:50:25被版主删除

#25


字符串后面应该有'\0'字符结束。

#26


要不自己用gdb调试看看

#27


vc下执行的,C怎么来的我也不知道,我也不想纠结于此了。先跳过,继续学习,以后可能会理解的。
#include<stdio.h>
  int main()
  {
  char c[5],b[5];
  int i;
  for(i=0;i<5;i++)
  {
  c[i]=getchar();
  getchar();
  b[i]=getchar();
  getchar();
  }
  c[6]=b[6]='\0';
  printf("c[5]=%s",c);
  printf("\n");
  printf("b[5]=%s",b);
  printf("\n");
  return 0;
  }

#28


引用 27 楼 guchang 的回复:
vc下执行的,C怎么来的我也不知道,我也不想纠结于此了。先跳过,继续学习,以后可能会理解的。
#include<stdio.h>
  int main()
  {
  char c[5],b[5];
  int i;
  for(i=0;i<5;i++)
  {
  c[i]=getchar();
  getchar();
  b[i]=getchar();
  getcha……


数组的长度只有5,却用c[6]=b[6]='\0';,这都6了,怎么可能对

#29


晕,越界了,上限都是4

#30


基础不雄

#1


不知道哦~~~~~

#2


越界了,出现期望中的结果是有可能的,也有可能出现其它结果。
环境能保证你的代码在“良好”的时候,有“预料中”的结果。
但是并不是说在代码“差”的时候,结果就不在预料中了。
当“差”代码的结果在预料中的时候,不要试图为这个作出解释,一切皆有可能。
你需要记住的是:写好的代码。

#3


越界。。。

#4


我晕   数组越界 

#5


引用 2 楼 baihacker 的回复:
越界了,出现期望中的结果是有可能的,也有可能出现其它结果。
环境能保证你的代码在“良好”的时候,有“预料中”的结果。
但是并不是说在代码“差”的时候,结果就不在预料中了。
当“差”代码的结果在预料中的时候,不要试图为这个作出解释,一切皆有可能。
你需要记住的是:写好的代码。
每次运行不是重新非配地址吗,为何c[5]后每次都是c,而不是其他的,b[5]为何没有类似情况呢

#6


引用 5 楼 yangling_t_r 的回复:
引用 2 楼 baihacker 的回复:
越界了,出现期望中的结果是有可能的,也有可能出现其它结果。
环境能保证你的代码在“良好”的时候,有“预料中”的结果。
但是并不是说在代码“差”的时候,结果就不在预料中了。
当“差”代码的结果在预料中的时候,不要试图为这个作出解释,一切皆有可能。
你需要记住的是:写好的代码。
每次运行不是重新非配地址吗,为何c[5]后每次都是c,而不是其他的,……

别去解释。。。
一定要解释的话,就是在特定环境,指定环境,由于某些原因,导致了这个。
但是并不能保证你环境变了,还有这些。

#7


因为没空字符结尾,而且你的数据不能够全部被放入到数组中作为字符串,而是作为了字符,我最近也是碰到了这样类似的问题,我也用数据做了几次测试:
发现输入的数据<=数组的长度*2,否则就出现了错误,至于原因,应该就是大于了2*数组长度了,导致数据不能被存放,也就是越界了。
 输出也只能是2*数组长度大小的字符。

#8


越界。。。。到了c的范围外面。。。

#9


= =我看不懂你这个循环是什么意思

#10


引用 9 楼 a328240784 的回复:
= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取

#11


引用 10 楼 goolloo 的回复:
引用 9 楼 a328240784 的回复:

= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取
那你们说的越界是什么意思?我自己脑子运行的是没有最后那个c的

#12


引用 11 楼 a328240784 的回复:
引用 10 楼 goolloo 的回复:
引用 9 楼 a328240784 的回复:

= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取
那你们说的越界是什么意思?我自己脑子运行的是没有最后那个c的

越界就是c[4]范围应该是从c开始四个int型长度的范围,但是他读出的时候没有'\0'或者NULL、EOF标志,就沿着地址继续读下去了,就超出c[]的范围了

其实他的程序理论上应该输入20个字符的,我也不知道他怎么弄的

#13


很明显  楼上越界了   没什么关系啦  新手  以后会好的

#14


这代码写的,楼主还是重新实现一下吧~

#15


引用 12 楼 goolloo 的回复:
引用 11 楼 a328240784 的回复:
引用 10 楼 goolloo 的回复:
引用 9 楼 a328240784 的回复:

= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取
那你们说的越界是什么意思?我自己脑子运行的是没有最后那个c的

越界就是c[4]范围应该是从c开始四个……

为什么说应该要输入20个呢,定义的是数组大小是5啊,2个数组不是输入10个吗,能说说嘛

#16


程序语法和逻辑都没问题,就是最后的输出方式不对,a b都是字符数组, 不是字符串,不能用%s输出,你知道\0在哪里呢?前五个字符不是都正常输出了嘛,后面输出什么都可能。 

#17


引用 15 楼 yangling_t_r 的回复:
引用 12 楼 goolloo 的回复:
引用 11 楼 a328240784 的回复:
引用 10 楼 goolloo 的回复:
引用 9 楼 a328240784 的回复:

= =我看不懂你这个循环是什么意思

scanf 有个缓存处理不了回车的问题,一般用fflush解决,这里用一个空的getchar把回车读取
那你们说的越界是什么意思?我自己脑子运行的是没有最后那个c的
……

你的循环是i<10,一个循环是输入两次,,,,,,

我觉得还是推翻重来比较好。。。这个问题还是蛮多的。。。

建议你在格式、风格上能有一些“标准化”

the elements of c++ style 可以看看,我其实以前比你还乱,现在在努力改正!
加油吧!

#18


感觉怎么跟以前的我一样专牛角尖...

#19


谢谢大家了,祝新年快乐

#20


越界。。。。到了c的范围外面。。。

#21


一个小程序,大侠们看下结果为何不一样一经3L提醒 我才发现
  printf{“c[5]=%s”,c);
  printf("\n");
  printf{“b[5]=%s”,b);
  printf("\n");

这里越界了

#22


当printf()的格式字符串是%S时,打印直到遇到'\0',结束
楼主在打印前stop,查看数组中的内容

#23


你要存5个字符就定义长度为6个的字符数组,系统会自动在最后给你加个\0 或者输出时用%c

#24


该回复于2011-02-09 10:50:25被版主删除

#25


字符串后面应该有'\0'字符结束。

#26


要不自己用gdb调试看看

#27


vc下执行的,C怎么来的我也不知道,我也不想纠结于此了。先跳过,继续学习,以后可能会理解的。
#include<stdio.h>
  int main()
  {
  char c[5],b[5];
  int i;
  for(i=0;i<5;i++)
  {
  c[i]=getchar();
  getchar();
  b[i]=getchar();
  getchar();
  }
  c[6]=b[6]='\0';
  printf("c[5]=%s",c);
  printf("\n");
  printf("b[5]=%s",b);
  printf("\n");
  return 0;
  }

#28


引用 27 楼 guchang 的回复:
vc下执行的,C怎么来的我也不知道,我也不想纠结于此了。先跳过,继续学习,以后可能会理解的。
#include<stdio.h>
  int main()
  {
  char c[5],b[5];
  int i;
  for(i=0;i<5;i++)
  {
  c[i]=getchar();
  getchar();
  b[i]=getchar();
  getcha……


数组的长度只有5,却用c[6]=b[6]='\0';,这都6了,怎么可能对

#29


晕,越界了,上限都是4

#30


基础不雄