2011-10-19 123 views
0

我有幾個關於C語法的問題。關於C語法的一些問題

  1. ch = (char *) malloc(sizeof(char) * strlen(src)); 什麼第一括號表示(字符*)?

  2. c=getch();

    switch(c) {

    case '1' :{

    我的老師問爲什麼 '這種類型的' 使用了引號,而不是 「雙」。我說如果使用char變量,它就是C語法。但他說不!爲什麼使用單引號而不加倍?

  3. 有時使用scanf什麼時候發生,它已被用於兩次得到的東西掃描。這個問題的原因是什麼? 例如:

    printf("enter string \n"); 
    scanf("%s",&str); 
    printf("enter char \n"); 
    scanf("%c",&ch); //does not scan my char 
    scanf("%c",&ch); //with this second line do scan my char 
    
+1

,能不能請您詳細說明你的最後一個問題?或者,如果你能提供一個澄清的例子,那就更好了。 – jweyrich

+0

我認爲(這)(http://stackoverflow.com/questions/7802540/while-switch-statement-weird-output/)問題有一個使用情況,並回答你的最後一個問題: –

+0

第三個問題編輯 –

回答

2
  1. 此澆鑄;它將malloc(a void*)的返回值視爲char*

  2. 這是一個普通的char文字。

+2

這是C.非標準函數'getch'最有可能返回'int'。 http://pubs.opengroup.org/onlinepubs/7908799/xcurses/getch.html –

+4

事實上,'getch'返回'int'。 – jweyrich

5
ch = (char *) malloc(sizeof(char) * strlen(src)); 

(char*)是一個演員。它表示將malloc的返回值作爲指向char的指針。然而,這並不是因爲void*必要的malloc返回類型是與C.

所有指針變量什麼是轉讓兼容更多的sizeof(char)是因爲sizeof(char) == 1定義亂真。最後這個分配幾乎可以肯定地分配一個元素太少了。需要有零終結符的空間。

因此,它或許應該這樣寫:

ch = malloc(strlen(src)+1); 

至於'1',這是一個char文字。它具有類型int

這不是太與"1"這是一個字符串混淆char*類型,一個指針到的含有兩個字符,一個內存塊隨後\0'1'


至於問題3,這是我不明白你的意思,並且在任何情況下,我會調用一個問題,在規則的時間來證明沒有解決它!其他人則回答說你。

+2

在C中,字符文字的類型爲「int」。 –

+0

@Sinan更正。 –

1
  1. 第一條語句開頭的(char )是一個類型轉換。默認情況下,malloc返回一個void,它應該可以分配給char *,但在其他情況下需要類型轉換。

  2. 你是正確的單引號應該用在字符。

  3. 說出scanf有時不起作用是沒有示例代碼的毫無意義的陳述。

2

在:

char *ch = (char *) malloc(sizeof(char) * strlen(src)); 

(char *)鑄傳回值char *。在C中,這完全沒有必要,並且can mask failure to #include <stdlib.h>

另外,sizeof(char)總是1,所以從不需要。

字符文字'1' has type int in C

最可能的是getch返回int。字符串文字"1"由兩個字符組成。數字1和字符串標記NUL字符的結尾。如果您使用過case "1":,則返回值getch將與指向"1"的指針的值進行比較(在隱式轉換爲int後)。

至於scanf,輸入緩衝區可能包含尚未被程序處理的輸入。請參閱Why does everyone say not to use scanf? What should I use instead?

8

其他人已經回答正確侑前兩個問題,所以我會回答你的第三個問題:當你進入一個character

,並按下回車鍵,兩個字符放入輸入緩衝區,characternewline個性。

你需要考慮這兩個。所以第一個scanf消耗換行符,另一個讀取字符。

分步代碼分析:

printf("enter string \n"); 
scanf("%s",&str); 

通過以上兩種說法,你看Enter the string和程序等待您的輸入。 讓我們假設您輸入字符C並按Enter一次。當您執行此操作時,輸入緩衝器接收兩個大字:

  1. 您輸入的字符C &
  2. 換行符\n

scanf的語句從讀取一個字符(C)輸入緩衝區。因此,newline字符在輸入緩衝區中保持未讀。

printf("enter char \n"); 
scanf("%c",&ch); //does not scan my char 

通過以上兩種說法,enter char被顯示,但scanf只是跳過(不等待任何UER輸入),這是因爲在輸入緩衝器中的未讀newline字符由該scanf讀取。

因此要正確接收下一個輸入字符,您需要額外的scanf

scanf("%c",&ch); //with this second line do scan my char 
+0

我很好奇,爲什麼'scanf'消耗在什麼似乎是相反的順序字符? –

+0

@DavidHeffernan:對不起,我看到這個評論比較晚(時間差異),Apparantely,我的答案是沒有解釋的,我加一步一個細節步驟,以回答您的查詢。 –

1
  1. (char *);它的意思是「將以下值作爲指向char的指針」。在這種情況下,這是多餘的,被認爲是不好的做法。

  2. '1'是字符常量;有點不直觀,它的類型爲int(這與C++不同,字符常量的類型爲char)。 「1」將是字符串常量,它實際上是char [2]類型的數組表達式,其內容爲{'1', 0}

  3. 這是因爲在上一次輸入操作中輸入流中留有換行符。假設你輸入「foo」並點擊Return;輸入流將包含字符'f','o','o','\ n'。第一個scanf調用讀取並將「foo」分配給str,在輸入流中留下尾隨的'\ n'。在下一個scanf調用中正在拾取該雜亂的換行符,因爲%c轉換說明符不會跳過空格(與其他所有轉換說明符不同)。

4

簡單來說:

1)以來的malloc返回類型的指針空隙,則在鑄造該指針char類型的指針,使得可變CH稍後將保持字符數組(一個字符串)

2)單引號主要用於,因爲C中的switch語句總是期望INTEGER而不是字符串。具有被單引號包圍的字符將返回字符的整數表示。

3)這是使用scanf時的一個常見問題,基本上它是由前一個scanf輸入的回車引起的。我建議你在使用之前總是刷新輸入。

下面是一個例子:

#include <stdio.h> 

int main (void) 
{ 
    char line[200]; 
    while(1) 
    { 
     printf("\nenter a string: "); 
     fflush(stdout);   // safety flush since no newline in printf above 
     scanf(" %[^\n]",line); // note space character 
     printf("you entered >%s<\n",line); 
    } 
    return 0; 
} 
0

我倒要添加到@Alok保存的答案。他分析了它正確然而,另一種簡單的解決方案存在的話,那就是在字符串格式使用scanf的一個空白如下:

scanf(" %c", &variable); 

這是因爲%C不吸收換行符別人一樣(如%d)。格式字符串中的任何空格將導致掃描吸收所有連續的空格,從而避免需要另一個scanf語句。

希望這會有所幫助!