2015-09-16 113 views
13

我的程序可以接受任意數量的長度或空輸入。但是,如果輸入爲空(空格或換行符),程序將繼續等待輸入。我也嘗試過fgets,但是如果按下空格/換行符,它仍會在關閉之前等待更多不是空格/換行符的輸入。在C中接受空字符串

Simpified代碼:

#include <stdio.h> 
main(){ 
int num; 
scanf("%i",&num); 
printf("%i",num); 
} 

輸入:

363792 

輸出:

363792 

期望:

輸入:

輸出:

我是C的新手,我很難完成此任務。

使用與fgets什麼嘗試:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
main(){ 

int n; 
char s[20]; 


fgets(s,20,stdin); 
n=atoi(s); 

printf("%i",n); 
} 

編輯:原來我沒有被編譯代碼的權利。所以每次我嘗試進行更改時,都會使用scanf查看原始代碼。

+0

意思是,你想忽略空輸入(空格或換行符)? – RDX

+1

如果你沒有輸入這個代碼輸出0,它是你的願望嗎? – ashiquzzaman33

+2

'scanf'不能按預期工作,因爲'%d'跳過前導空格字符。 –

回答

19

我也試着與fgets但如果按下空格/換行符,它仍在等待更多的投入是不打烊前一個空格/換行符。

首先fgets將在這種情況下工作。如果您向我們展示了您正在嘗試使用fgets()做什麼,那麼對此問題的回答將會非常狹窄或非常具體。

我試圖用fgets()來做同樣的事,下面是代碼片段。

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

int main(int argc, char *argv[]) 
{ 
    char string[100]; 
    printf("Enter a number: "); 

    fgets (string, 100, stdin); 
    /* Here remove the trailing new line char; not required unless you are trying to print the string */ 
    string[strlen(string) - 1] = '\0'; 

    printf("Num is %d\n", atoi(string)); 

    return 0; 
} 

如果沒有輸入或只需輸入或空間並輸入,然後打印數量將爲零,且與fgets()不會等到你輸入有效的數字。

此外,請檢查爲什麼你不應該使用得到Do not use gets()

+0

我曾嘗試過這樣的代碼。我只是沒有意識到新代碼沒有被編譯:(謝謝你的幫助!它的工作原理! – JavvaTheHutt

+1

'string [strlen(string) - 1] ='\ 0';'當沒有'''時錯誤地截斷\ n''。如果第一個字符是一個罕見的嵌入式''\ 0'',那麼它是未定義的行爲。關於這一行,最好使用http://stackoverflow.com/a/28462221/2410359 – chux

+1

:'string [strlen字符串) - 1] ='\ 0';'這在所有情況下都不能正常工作,原因有兩個:1)如chux所述,如果沒有換行符,則行會被破壞。 2)如果在windows/dos下運行,(換行符實際上是兩個字符),這不會刪除換行符,只會損壞它。建議使用類似:'char * offset = strstr(string,「\ n」); if(NULL!= offset)* offset ='\ 0';' – user3629249

5

你應該閱讀文字輸入字符和停止閱讀,如果讀取字符不是一個數字:

char ch; 
while(1) 
{ 
    ch=getchar(); 
    if(isdigit(ch)) 
    { 
     putchar(ch); 
    } 
    else 
    { 
     break; 
    } 
} 
+2

由於getchar返回int,所以'ch'應該是'int'。 –

7

scanf()

定義功能將讀取並忽略任何空白在下一個非空白字符之前遇到的字符。

所以你不能使用scanf()得到你想要的結果。 由於gets()不安全,它行爲不端。如果您需要使用atoi(),則可以使用fgets()獲取輸入並將其轉換爲整數。

下面的示例代碼,你可以嘗試:

#include <stdio.h> 
#include<stdlib.h> 
#include<string.h> 
main() 
{ 
    int num; 
    char ch[100]; 
    fgets(ch, sizeof ch, stdin); 
    if (strlen(ch)>1&& ch[strlen(ch)-1] == '\n') 
    { 
     ch[strlen(ch)-1] = '\0'; 
     num = atoi(ch); 
     printf("%i\n", num); 
    } 
} 
+6

這是一個壞主意。 [永遠不要使用'gets()'。](http://stackoverflow.com/q/1694036/1679849) –

+0

@Enzo Ferber請澄清「爲了忽略空格,需要一個空格在格式之前」。當然''scanf(「%d」,...)'和'scanf(「%d」,...)'同樣掃描'int'。 – chux

+0

@chux是的,我以爲我已經刪除了它。 –

1

好吧,你不明白scanf()做了什麼,它會掃描整個輸入字符串並尋找像%d,%f,%s這樣的特殊字符,直到它沒有得到字符串中的內容爲止等待。

scanf("%d %d", a, b); 

,當你進入2個整數值將只得到完成,如果按下空格就不能算作整型值,因此它會忽略它。