读取字符到数组的程序 有些有关问题麻烦帮看一下

读取字符到数组的程序 有些问题麻烦帮看一下
本帖最后由 xiaolei911014 于 2013-09-09 22:02:18 编辑
读取一行输入,并且反向打印输入,用具用%c的scanf()从输入中一次读取一个字符到数组 但是好像读取那段不正常  有哪位朋友给解释一下呗
#include <stdio.h>
#include <string.h>

int main()
{
  char str[255],ch;
  int i =0;
  while(str[i] != '\n')
  {
    
    scanf("%c",&str[i]);
    i++;
  }
  str[i] = '\0';
   int size = strlen(str);
  for(int a = size; a >= 0;a--)
  {
    printf("%c",str[a]);
  }
  printf("\n");
  return 0;
}

------解决方案--------------------
bug:采集的数据在str[i],然后while判断是尚未采集数据的str[i + 1],这是程序问题所在。估计,你的while循环“几乎”是个死循环(意外遇到\n,可能死不了),而且可能导致数组越界!

其它小问题,简单罗列一下:
1.ch木有使用
2.循环进入的时候,如果str[0] == \n,那么程序无法采集数据
3.str[size]是结束符,没有必要输出,从size-1开始吧
4.下标索引习惯使用i,在这里采集完数据之后,i也没有再使用,没有必要再重新定义个下标索引a
5.如果你连续输入》256字符,while循环将导致数组越界

that's all!over!
------解决方案--------------------
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
whlie (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。