| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3048 人关注过本帖
标题:初学C语言,小问题一个
只看楼主 加入收藏
窗前的茶
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:24
专家分:34
注 册:2016-1-20
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:14 
初学C语言,小问题一个
#include <stdio.h>
#define NONBLANK 'a'
int main ()
{
    int c,lastc;
    lastc=NONBLANK;
    while((c=getchar())!='\n')
        {
        if(c!=' ')
            putchar(c);
        if(c==' ')
            if(lastc!=' ')
                putchar(c);
        lastc=c;
        }
}
这个可以让输入进的多个空格变成一个

但是为什么可以把 c 定义成int哩?不应该是char嘛?

不明白为什么,


就像这个
#include <stdio.h>
int main ()
{
    int a='a';
    printf("%c\n",a );
}

为什么能把int a还等于字符a哩?

搜索更多相关主题的帖子: include C语言 
2016-01-21 13:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這是C語言的特色,把char與數値等同對待。

授人以渔,不授人以鱼。
2016-01-21 13:45
不可亢力
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-1-21
收藏
得分:0 
要区分  a     ‘a’
a是字符不假,而‘a’是a对应的ASICC码值。
你的宏定义是吧,a对应的ASCII码值定义为NONBLANK。
还有要区分putchar(a)和putchar(‘a’)。
2016-01-21 14:27
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用不可亢力在2016-1-21 14:27:46的发言:

要区分  a     ‘a’
a是字符不假,而‘a’是a对应的ASICC码值。
你的宏定义是吧,a对应的ASCII码值定义为NONBLANK。
还有要区分putchar(a)和putchar(‘a’)。



不明觉厉

DO IT YOURSELF !
2016-01-21 15:21
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
a定义是int,printf("%c\n",a );这个编译器会报错吧
2016-01-21 15:27
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用foxeer在2016-1-21 15:27:38的发言:

a定义是int,printf("%c\n",a );这个编译器会报错吧

做过测试没有  如果否 请勿~~~~~~~~~~~~~~~~~~~~

DO IT YOURSELF !
2016-01-21 15:32
窗前的茶
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:24
专家分:34
注 册:2016-1-20
收藏
得分:0 
回复 5楼 foxeer
没有报错,完美运行~~
2016-01-21 17:31
窗前的茶
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:24
专家分:34
注 册:2016-1-20
收藏
得分:0 
回复 2楼 TonyDeng
能说的详细一点吗?
2016-01-21 17:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
以下是引用窗前的茶在2016-1-21 17:49:56的发言:

能说的详细一点吗?


這裏有兩個原因:

第一,C語言中,char代表一個字符,但正如你知道,計算機是一切皆數値的,在內部處理上,與彙編語言一樣,C把一個數値視爲是char還是int,在於程序員需要它“表現”爲char還是int,當你需要它是一個char,那麽就解釋爲char,需要它是一個int,那么就解釋爲int,但這個數本身是不變的。本質上,計算機中所有數據都是這樣。比如十進制數値97,當你認爲此時需要它代表一個char時,就解釋爲字符'a',否則,它是數値97。C語言與彙編接近,它採取這種直接轉化的方式處理,説C語言傾向於低級語言,其中一個原因就在這裏。但要注意,其他高級語言中,在語法層面上是不允許這樣明顯的,必須要加一個轉換儀式,比如像chr(97)這樣的函數,才是把數値轉化爲字符的,哪怕這種動作其實很簡單、甚至根本就沒動作,也要這樣寫,這是編程高級語言不讚成人類閱讀機器語言的原因,畢竟代碼是寫給人看的,給機器看的另有編譯器翻譯給它們看,人不應該看與人思維接近的語言。所以,這是我前面特意強調這是C語言特色的用意是在。實際上,你之所以會就這個問題,就是因爲這種偏機器底層的語法與正常人有差異。但這是合法的。

第二,你注意函數getchar(),它的定義,就是返回一個int數據,而不是像命名中所反映的是get a char。這又是C和彙編語言的一個基本特色,即函數的返回値身兼多職,它在正常時候,返回的就是屬於char範圍內的int數値,落在0-127之間,但由於接收輸入有可能發生錯誤,即讀到的不是可以表示爲char的數據,那麽它要告訴調用者發生了錯誤,就刻意把返回値取爲-1(因爲這肯定不是char含義的數値),那麽當調用者檢查這個返回値發現是-1的時候,就知道度到的數據是不可以拿來使用的。所以,這種時候,返回値既承擔了返回char數據的角色,也兼任了返回錯誤編碼的角色,這兩種角色是不同的數據類型,但都可以納入int範圍內,故接收getchar()返回値的變量c,也必須被聲明爲int才可以。在C語言中,char經常被編譯器內置爲unsigned char,是無符號的,永遠不爲負値,但偏偏getchar()爲了表示錯誤返回-1,一旦被賦値給unsigned類型變量,就變成了很大的一個正數,此時後續的錯誤檢查語句就可能出錯。宏EOF是値是-1。還是上面那樣,現代的編程語言,基本上不再鼓勵這種兼職行爲。

授人以渔,不授人以鱼。
2016-01-22 13:01
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 6楼 wp231957
我的vs2015提醒我a是int类型,初学的时候我也犯过这样的错误
2016-01-22 14:47
快速回复:初学C语言,小问题一个
数据加载中...
 
   



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

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