问个C语言的简单问题

yu5212 2009-04-20 04:27:29
最近开始接触C,看了一个书上的例子,源码如下[代码1],我调试的时候没有输出结果。但是把while用{}将printf包含[代码2]有输出,但是与源程序的意思不符。如果是{}不包含printf[代码3],还是没有输出,请告诉我一下哪里错了,新手,表笑我:)
[代码1]
#include <stdio.h>
/* count digits, white space, others */
main()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",
nwhite, nother);
}

[代码2]
#include <stdio.h>
/* count digits, white space, others */
main()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
{
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",nwhite, nother);
}
}

[代码3]

#include <stdio.h>
/* count digits, white space, others */
main()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
{
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
}
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",nwhite, nother);
}
...全文
98 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yu5212 2009-04-20
  • 打赏
  • 举报
回复
cyldf与warren258的做法是对的,具体的原因,应该是getchar()在命令行下得到的结束标志是\n(asc码为10)而不是字符串自动附加的EOF标志。书上有几个与这个程序类似的例子也是这个错误。同时谢谢其余的几位朋友。
warren258 2009-04-20
  • 打赏
  • 举报
回复
#include <stdio.h> /* count digits, white space, others */ 

void main()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
{
if (c >= '0' && c <= '9') ++ndigit[c-'0'];
else if (c == ' ' || c=='\n'||c == '\t') ++nwhite;
else ++nother;
if(c==10) break;
}
printf("digits =");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",nwhite, nother);
}


while进入了死循环,这样没有办法输出,加句if(c==10) break;的原因是当输入完成后跳出次循环,至于为什么输入结束的标志是c==10;我也不知道,我跟踪后发现的。有待高手指教。
lingyin55 2009-04-20
  • 打赏
  • 举报
回复
试试这样

#include <stdio.h>
/* count digits, white space, others */
int main()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
{
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
}///////
printf("digits =");//////////
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);////////////
printf(", white space = %d, other = %d\n",nwhite, nother);
return 0;
}
  • 打赏
  • 举报
回复
统计数据而已
cyldf 2009-04-20
  • 打赏
  • 举报
回复
while ((c = getchar()) != EOF)
改成while((c=getchar()) != '\n'),输入回车代表结束
mengde007 2009-04-20
  • 打赏
  • 举报
回复
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];

这个循环只能判断0~9,其余的都不能;好无意义;
Qlaiaqu 2009-04-20
  • 打赏
  • 举报
回复
循环之中退出循环的判断条件是遇到输入流尾部
ctrl+z 字符来结束输入就行了
piginthetree 2009-04-20
  • 打赏
  • 举报
回复
这段代码的意思是要你输入一段字符, 然后会打印出统计数据哦,
while ((c = getchar()) != EOF)
这个是循环统计,在win下面是ctrl+z跳出循环
在unix下面是ctrl+d跳出循环
楼主是不是输完没有跳出?
内容简介 本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 本书结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 全球C语言程序员集体智慧的结晶;Amazon全五星图书;权威解答495个最常遇到的C语言问题。C是一门简洁精妙的语言,掌握基本语法容易,真正能够自如运用,就不那么简单了。你难免会遇到各种各样的问题,有些可能让你百思不得其解,甚至翻遍图书馆,也找不到问题的答案。《你必须知道的495个C语言问题》的出版填补了这一空白。许多知识点的阐述都是其他资料中所没有的,弥足珍贵。涵盖C99标准。 第1章 声明和初始化 C语言的声明语法本身实际上就是一种小的编程语言。一个声明包含如下几个部分(但是并非都必不可少):存储类型、基本类型、类型限定词和最终的声明符(也可能包含初始化列表)。每个声明符不仅声明一个新的标识符,同时也表明标识符是数组、指针、函数还是其他任意的复杂组合。基本的思想是让声明符模仿标识符的最终用法。(问题1.21将会更加详细地讨论这种“声明模仿使用”的关系!)  基本类型  让一些程序员惊奇的是,尽管C语言是一种相当低级的语言,但它的类型体系仍然略显抽象。语言本身并没有精确定义基本类型的大小和表示法。  问:我该如何决定使用哪种整数类型?  答:如果可能用到很大的数值(大于32 767或小于一32 767),就使用lon9型。否则,如果空间很重要(例如有很大的数组或很多的结构),就使用short型。除此之外,就用int型。如果定义明确的溢出特征很重要而负值无关紧要,或者希望在操作二进制位和字节时避免符号扩展的问题,请使用对应的unsigned类型。(但是,在表达式中混用有符号和无符号值的时候,要特别注意。参见问题3.21。)尽管字符类型(尤其是unsigned char型)可以当成“小”整数使用,但这样做有时候很麻烦,不值得。编译器需要生成额外的代码来进行char型和int型之间的转换(导致目标代码量增大),而且不可预知的符号扩展也会带来一堆麻烦。(使用unsigned char会有所帮助。类似的问题参见问题12.1。)在决定使用float型还是double型时也有类似的空间/时间权衡。(很多编译器在表达式求值的时候仍然把所有的float型转换为double型进行运算)。但如果一个变量的地址确定且必须为特定的类型时,以上规则就不再适用。很多时候,人们错误地认为C语言类型的大小都有精确的定义。事实上,能够确保的只有如下几点:  …… 目录第1章 声明和初始化 第2章 结构、联合和枚举第3章 表达式第4章 指针第5章 空指针第6章 数组和指针第7章 内存分配 第8章 字符和字符串 第9章 布尔表达式和变量第10章 C预处理器第11章 ANSI/ISO标准C 第12章 标准输入输出库第13章 库函数第14章 浮点运算第15章 可变参数列表第16章 奇怪的问题第17章 风格第18章 工具和资源第19章 系统依赖第20章 杂项术语表 参考文献 
全国计算机等级考试2级C语言题库(电子版) 很多人对学习C语言感到无从下手,经常问我同一个问题:究竟怎样学习C语言?我是一个教师,已经开发了很多年的程序,和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言。经过这些年的开发,我深深的体会到C语言对于一个程序设计人员多么的重要,如果不懂C语言,你想写底层程序这几乎听起来很可笑,不懂C语言,你想写出优秀高效的程序,这简直就是天方夜谭。为什么C语言如此重要呢? 第一:C语言语法结构很简洁精妙,写出的程序也很高效,很便于描述算法,大多数的程序员愿意使用C语言去描述算法本身,所以,如果你想在程序设计方面有所建树,就必须去学它。 第二:C语言能够让你深入系统底层,你知道的操作系统,哪一个不是C语言写的?所有的windows,Unix,Linux,Mac,os/2,没有一个里外的,如果你不懂C语言,怎么可能深入到这些操作系统当中去呢?更不要说你去写它们的内核程序了。 第三:很多新型的语言都是衍生自C语言,C++,Java,C#,J#,perl...哪个不是呢?掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去 开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it行业,那么就一定要掌握好C语言

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧