2016-08-29 67 views
3

我通過的ReadLine採取在一個字符串從stdinput()一拉的第一個字符:抓住一個字符串

char * cmdLine = readline(); 

然後我想看看是否通過的ReadLine生成的字符串的第一個字符()是一個感嘆號。但代碼

if(cmdLine[0]=="!") 

不這樣做對我來說就像我會想到的那樣。我認爲,如果從標準輸入陷入僵局字符串爲「!1」來說那將是真實的

cmdLine[0]=="!" 

如果CMDLINE是一個指向字符串,則不能看我的字符串中的每個字符與數組括號?我知道這是一個愚蠢的基本C /指針問題,但這真的讓我絆倒...

+4

您試圖比較整數(CMDLINE [0])的指針(「!」)應該已經創建了一個大胖子的編譯器警告。如果沒有,請找出如何將警告提高。 –

+0

還有一個問題:你的評論聽起來有幫助嗎?如果是這樣,那麼你是一個比有幫助的人更好的程序員... – nbk

+0

是的,它是有幫助的。一旦編譯器發出警告,您將很快看到這些問題。這就是編譯器*有*警告的原因。 –

回答

8

更改"!"'!'。您正在比較單個字符與另一個字符。在C指定用單引號

+0

謝謝!我很感謝你的回答。 – nbk

+0

@nbk然後公平,並將其標記爲公認的答案! –

1

雙引號中C

用於表示字符的陣列。默認情況下,空字符將被添加到雙引號內的任何內容中。所以

"!" // makes for two characters the '!' and the terminating null character '\0'. 

你的意圖顯然是比較單個字符,一個字符 應該用單引號。所以,正確的對比將

if(cmdLine[0]=='!') 

cmdLine[0]=="!"會發生什麼?

作爲我的答案的第一部分說,"!"使空終止的字符數組或有效的字符串。該(常量)字符串存儲在目標文件的數據段部分。對"x"的引用給出了字符串的起始地址,即你得到一個指針。因此,當你做

if(cmdLine[0]=='!') 

你比較一個整數(記住,char是一個整數型)的指針。雖然這可能不會產生錯誤(這在[ this ]答案的第2點中得到了解決),但您不會得到預期的結果。

+1

謝謝!我很感謝你的回答。 – nbk

4

你有兩個錯誤:

  1. 第一個(不那麼重要)一個是你一個char比較的指針。 element11的答案解決了這一問題。

  2. 第二個(更重要的)錯誤是您的構建過程的警告級別太低。解決這個問題更重要,因爲它不僅可以幫助你找到bug#1,還可能有很多其他的bug。

如何做到這一點取決於您的編譯器。當使用gcc,該-Wall -pedantic選項是一個良好的開端:

$ gcc -Wall -pedantic test.c 
test.c: In function ‘main’: 
test.c:7:16: warning: comparison between pointer and integer 
    if (cmdLine[0]=="!") { 
       ^
test.c:7:16: warning: comparison with string literal results in unspecified behavior [-Waddress] 
+0

這裏有很好的信息。在c中,未定義的行爲是你想要的最後一件事。 C通常很樂意繼續進行未定義的行爲,就好像沒有什麼不好的事情發生一樣。一直給你輸出你不指望。讓你的編譯器抓住這些是件好事。隨着程序規模的增長,未定義的行爲可能成爲一場噩夢。 – element11

相關問題