c直接从教科书中删除

时间:2013-07-03 14:22:21

标签: c arrays casting segmentation-fault kernighan-and-ritchie

我最近选择了C编程语言(第2版)并且一直在研究本书中的例子。阵列给我带来了麻烦。具体来说,它似乎与类型铸造有关。 1.6节示例读取输入,然后计算属于某些类别的字符数。当我通过可执行文件管道源代码时,这段代码似乎创建了一个段错误,此外还没有正确捕获任何数字字符。如果我使用标准输入和^ D到EOF,那么它根本不会捕获数字而是将它们计为其他字符(尽管没有段错误)。

while ((c=getchar())!=EOF)
  if(c>='0'&&c>='9')
    ++ndigit[c-'0'];

我已经消除了它是程序的另一部分通过交换其他部分导致故障的可能性,但如果它有帮助我仍然可以发布其余部分。根据我的理解,这个循环应该通过输入中的单个字符。如果它们的值介于0和9之间,则会将字符转换为数字(对应于ndigit数组位置0-9)并将该数组位置增加1.

K& R 2e是否已经过时了?字符编码(ASCII与Uni​​code)在将字符数转换为整数时是一个问题吗?任何建议将不胜感激。

我不确定如何检查我的编码(如果它甚至重要)但我的编译器是gcc(Ubuntu / Linaro 4.7.3-1ubuntu1)4.7.3

2 个答案:

答案 0 :(得分:5)

if(c>='0'&&c>='9')

嗯,你的意思是:

if(c>='0'&&c<='9')

另请检查c是否已使用int类型而非char进行了正确声明。

答案 1 :(得分:0)

由于我的数组循环中出现了拼写错误,我在这项练习中遇到了困难。

for (i = 0; 1 < 10; ++i)
     ndigit[i] = 0;

应该是..

for (i = 0; i < 10; ++i)
      ndigit[i] = 0;

请注意 i 1 是转置