2016-11-15 100 views
1

我很新的c和我已經發現,使用scanf函數後我的char *字符串參數被修改,輸入到c不會改變結束輸出也不是實際參數。儘管它看起來代碼的下一步確實會改變最終的輸出結果。我找不到任何這種在線發生的例子嗎?有人知道這是什麼嗎?我唯一想到的是,我在想念的東西,但我看不出它是什麼scanf後修改參數

#include <stdio.h> 
#include <stdlib.h> 

int method1(char *string){ 
    char c; 
    printf("enter(y/n): "); 
    scanf("%s", &c); 
    printf("%s\n", string); 
    return 0; 
} 

int main() { 
    char *string = "string"; 
    printf("%s\n", string); 
    method1(string); 
    return 0; 
} 

輸出: 字符串 輸入(Y/N):Y▒E▒

回答

4

c可容納只是一個單一的焦炭。但是

scanf("%s", &c); 

會讀取多個字符,並且在c中沒有空間。因此,它是undefined behaviour。 即使只輸入1個字符,%s仍然需要一個用於終止空字節的空間。

如果你只是想讀一個字符,那麼你可以使用fgets()如下:

char c[2]; 
if (fgets(c, sizeof c, stdin)) { 
    /* c[0] contains your input 'y' or 'n' */ 
} 

始終避免scanf()。參見:Why does everyone say not to use scanf? What should I use instead?