2017-02-20 154 views
-2

我有這段代碼是應該要求用戶輸入一些信息:gets_s()是越來越跳過

char * nome = malloc(256); 
char * cc = malloc(256); 
char * morada = malloc(256); 
char * tlf = malloc(20); 
printf("Novo nome:"); 
gets_s(nome, sizeof(nome)); 
printf("Nova Morada:"); 
fflush(stdin); 
gets_s(morada, sizeof(morada)); 
printf("Cartao de cidadao:"); 
fflush(stdin); 
gets_s(cc, sizeof(cc)); 
printf("Novo Contacto:"); 
fflush(stdin); 
gets_s(tlf, sizeof(tlf)); 

第一gets_s()獲取的跳過,我不明白爲什麼,我已經也嘗試使用scanf("%s",nome),並試圖用戶通過堆棧溢出發現一些解決方案,因爲據我瞭解scanf()會發生什麼是最後一個字符實際上是「自動」讀取的,因爲它沒有在之前的scanf(),但我不認爲這是事實,因爲我已經嘗試了所有我能找到的建議。 任何人都可以闡明爲什麼會發生這種情況?

編輯:

char nome[256]; 
char cc[256]; 
char morada[256]; 
char tlf[20]; 

printf("Novo nome:"); 
fflush(stdin); 
scanf("%s", nome); 

printf("Nova Morada:"); 
fflush(stdin); 
scanf("%s", morada); 

printf("Cartao de cidadao:"); 
fflush(stdin); 
scanf("%s", cc); 

printf("Novo Contacto:"); 
fflush(stdin); 
scanf("%s", tlf); 
+5

1)'fflush(stdin);'調用未定義的行爲2)您不檢查'malloc'和'gets_s'的任何結果。 3)邊界檢查接口是可選的。爲什麼不使用'fgets'? 4)指針不是數組。 5)獲取你的C書並閱讀'sizeof'的功能。 – Olaf

+0

我感謝您的評論。首先你說「調用未定義的行爲」是什麼意思? 我已經按照你的建議使用了fgets(),但結果是一樣的,我拋棄了fflush(),因爲我從你的評論中瞭解到它的行爲沒有定義,因此它不清楚緩衝區。 仍然得到相同的結果 – LikeIfYouCaredAboutMyName

+2

你最大的問題是以不恰當的方式使用'sizeof'。 – DyZ

回答

0

它更容易使用fgets()scanf()當你想讀取包含空格的字符串。另請注意,根據標準,fflush(stdin)導致未定義的行爲,但Microsoft支持此用法的定義行爲。不過,這是不是便攜式,可能永遠不應該使用。

當您使用fgets()讀取一行輸入時,尾隨換行符存儲在輸入緩衝區中,因此您可能需要將其刪除。有很多方法可以做到這一點,但在這裏我使用string.h中的strchr()函數來編寫一個小函數eat_newline(),它找到換行符並用空字符替換它。

對使用​​fgets(),雖然它不在這裏使用的優點,就是可以在一個線路輸入的閱讀,然後用sscanf()解析它,因爲你會使用scanf()以同樣的方式,而是用更多的控制,以及重新掃描同一行輸入的能力。

#include <stdio.h> 
#include <string.h> 

void eat_newline(char *str) 
{ 
    char *find;  
    if ((find = strchr(str, '\n')) != NULL) { 
     *find = '\0'; 
    }  
} 

int main(void) 
{ 
    char nome[256]; 
    char cc[256]; 
    char morada[256]; 
    char tlf[20]; 

    printf("Novo nome:"); 
    fgets(nome, sizeof nome, stdin); 
    eat_newline(nome); 

    printf("Nova Morada:"); 
    fgets(morada, sizeof morada, stdin); 
    eat_newline(morada); 

    printf("Cartao de cidadao:"); 
    fgets(cc, sizeof cc, stdin); 
    eat_newline(cc); 

    printf("Novo Contacto:"); 
    fgets(tlf, sizeof tlf, stdin); 
    eat_newline(tlf); 

    printf("nome: %s\n", nome); 
    printf("morada: %s\n", morada); 
    printf("cc: %s\n", cc); 
    printf("tlf: %s\n", tlf); 

    return 0; 
} 
+1

這是這是迄今爲止最好的答案,也是最能解決我問題的答案。謝謝你的詳細解答和例子,先生 – LikeIfYouCaredAboutMyName