首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求教,这个输出为何是乱码啊

2012-08-27 
求教,这个输出为什么是乱码啊:C/C++ code#includestdio.hint main(){char arr[30]char chprintf(plea

求教,这个输出为什么是乱码啊:

C/C++ code
#include"stdio.h"int main(){        char arr[30];    char ch;    printf("please input crecater,if you want to quit ,input '#'\n");        int i=0;        if(i<=30){            while ((ch=getchar())!='#')                    {                arr[i]=ch;                    i++;                }                        }        for(i=0;i<=30;i++){            printf("%c",arr[i]);        }                printf("\n");            getchar();}


输出结果是这样的 :

  frem@frem-workstation:~/program/test$ ./getchar 
please input crecater,if you want to quit ,input '#'
d
g
c
g
a
#
d
g
c
g
a
??r?5?[?p2u?I?
frem@frem-workstation:~/program/test$

[解决办法]
楼主要注意以下几点:
1、getchar 会吸收任意字符 包括回车等
2、你的 if(i<=30) 语句 写的没营养,我想按你的逻辑应该是while (i <= 30 && (ch=getchar())!='#') 将它放入while循环条件判断中。
3、你定义的数组大小为30 而你将数组从 0-30 的使用把数组当成了31的长度这样是不对的。
4、之所以后面的输出为乱码是因为你输入的字符不够30 而你强制输出了31 个字符,所以除了你输入的字符其它输出的都是字符数组未初始化导致输出了随机值是乱码
5、编程格式楼主在 的大括号用了两种风格一种如下
if(){

}
一种如下:
while()
{

}
建议楼主写的时候注意还是统一的好,一般c 都是用后者风格,良好的编程习惯是将来成长的关键!

[解决办法]
我重新编译了一下,下面代码可实现要求。
#include<stdio.h>
#define NARRAY 30

int main()
{
char arr[NARRAY]={0};
char ch;
printf("please input crecater,if you want to quit ,input '#'\n");

int i = 0;
while ( i < NARRAY ) //去掉原来if语句,加在while循环判断条件中
{
ch = getchar();
if(ch == '#')
break;
arr[i] = ch; 
fflush( stdin ); //清除缓存区数据
i++;
}

for( i = 0; ; ++i )
{
if(arr[i] == 0)
break;
printf( "%c", arr[i] );
}
printf("\n");
return 0;
}

我看了楼主的代码,有些问题很严重:
1、数组下标越界,注意,char arr[30];数组arr下标是0~29;
2、getchar()读入字符,把回车符也会读入,所以连续输入字符的时候一定要在下次输入前清除缓存的数据,不然会读入到ch。
其他的xiezhunben在八楼说的很清楚了。
我也学习了,谢谢xiezhunben。

热点排行