| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1654 人关注过本帖, 1 人收藏
标题:混合字符和数值输入
只看楼主 加入收藏
破碎的石头
Rank: 2
等 级:论坛游民
帖 子:71
专家分:13
注 册:2012-12-11
收藏
得分:0 
回复 19楼 神龙赖了
这样说的话 这个函数最好是不是返回‘\n’也就是说ch=‘\n’吗?
2012-12-11 22:43
农民也疯狂
Rank: 2
来 自:伯纳乌
等 级:论坛游民
帖 子:48
专家分:56
注 册:2012-12-4
收藏
得分:0 
回复 16楼 TonyDeng
擦,学习了,从来没关注过,原来getchar真是返回的int

屌丝的世界不容懈怠
2012-12-11 22:47
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
回复 21楼 破碎的石头
对,最后getchar()返回'\n',所以循环结束

I have not failed completely
2012-12-11 22:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用破碎的石头在2012-12-11 22:39:15的发言:

这样就可以说明了前面为什么用int了,也就是说getchar()读取的字符都是以整数型保存的吗?

char的实质是int型的,它通常被编译器预设为unsigned int(但可以通过编译参数改变),因为getchar()使用老式的汇编风格,喜欢通过返回一个非法的数值来标识出错,所以它通过返回-1来表示读数错误,但如果你的接受返回值数据类型为char,就极可能被解释为unsigned int,从而变成巨大的正值,此时你再用它与EOF比较,就得不到应得的结果——这个是C语言典型的陷阱,《C缺陷与陷阱》一书中有讲解的。

在C中,其实没有什么char型,每个字符,比如'a',都是以int的形式储存的,在编码时,你写char,只不过告诉编译器把某个数字解释为一个应该表示为字符的编码,而非数值。它到底是数值还是字符,是程序员可以任意变换的。所以在C语言中,才有诸如b = 'a' + 1这样的写法,用一个字符数据与整数进行运算——虽然实际上不提倡这样写,但却是C程序员的习惯,最好改变一下,这是坏习惯。

另外,不要再习惯把char视为单字节了,在国际化的今天,字符集的范围比ASCII大得多,通常是两字节的,一般都使用wchar_t了,特别是你要处理中文的时候。

[ 本帖最后由 TonyDeng 于 2012-12-11 22:52 编辑 ]

授人以渔,不授人以鱼。
2012-12-11 22:48
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
但是ch不等于'\n',因为虽然你用了getchar(),但是并没有用东西储存它啊,所以就相当于清除了

I have not failed completely
2012-12-11 22:49
破碎的石头
Rank: 2
等 级:论坛游民
帖 子:71
专家分:13
注 册:2012-12-11
收藏
得分:0 
回复 24楼 TonyDeng
谢谢。。。
2012-12-11 22:51
破碎的石头
Rank: 2
等 级:论坛游民
帖 子:71
专家分:13
注 册:2012-12-11
收藏
得分:0 
回复 25楼 神龙赖了
那如果ch=get_first();呢?ch='\n'吗?
2012-12-11 22:53
一个人的孤独
Rank: 2
等 级:论坛游民
帖 子:45
专家分:56
注 册:2012-10-15
收藏
得分:4 
ch=getchar()好像和while(getchar()!=\n){
continue;
return ch;
}一样的吧
2012-12-11 22:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用破碎的石头在2012-12-11 22:12:41的发言:

惭愧。新手自学【C primer plus】,在第8章8.7.2那里卡住了。代码如下:
char get_first(void)
{
int ch;
ch=getchar();
while(getchar()!='\n')
continue;
return ch;
}
请问ch为什么定义为int?还有怎么样实现“读取一行第一个字符并将其余字符丢弃掉”?

你这个函数,应该是这样写:
程序代码:
int get_first(void)
{
    int ch;
    ch = getchar();                // 直接把第一个getchar()的结果返回,那有可能就是一个错误码,不要转换为char,函数返回也直接是原封不动的int
    while (getchar() != '\n')      // 这个空循环,是把输入缓冲区中的剩余数据清空,即一直到'\n'之间的全部内容都清除,否则下次读数据时会被读入
    {
        ;
    }
    return ch;                     // 在清空了输入缓冲区之后再把刚才第一个读到的内容反馈出去,包含错误码
}

这个while()循环是抛弃式读数,数据必须要读取,但不使用,读入即弃,但不读不行,所以不要以为它没用。

[ 本帖最后由 TonyDeng 于 2012-12-11 23:01 编辑 ]

授人以渔,不授人以鱼。
2012-12-11 22:58
破碎的石头
Rank: 2
等 级:论坛游民
帖 子:71
专家分:13
注 册:2012-12-11
收藏
得分:0 
回复 28楼 一个人的孤独
你看错了、
2012-12-11 23:03
快速回复:混合字符和数值输入
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019151 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved