簡體   English   中英

在C字符串輸入中接受空格

[英]Accepting space in C string input

我是C語言的新手,正在開發一個小程序。

實際上,我正在嘗試使用scanf從用戶那里獲取字符串。 但是,每當我輸入帶空格的字符串時,程序便會無限運行,並且我必須按停止按鈕。 我在網上看到了示例,也使用了它們,但是那給了我一個新的錯誤。

這是我的代碼

struct student s1;
char input[MAX_NAME_SIZE];
printf("Enter name>");
scanf("%s",input);
if(strlen(input) > 10)
{
    int l;
    for(l = 0 ;l <  10;l++)
        s1.name[l] = input[l];
}

int error = 0;
do
{
    if(error == 1)
        printf("Invalid day. ");

    printf("Enter birthday: day>");
    scanf("%u",&s1.birthday.day);
    error = 1;
}while(s1.birthday.day < 1 || s1.birthday.day > 31); //checking the criteria 

我也使用過scanf(“%[^ \\ n] s,input),但是它隨后跳過了scanf並轉到了第二個scanf。

請幫忙

而不是使用

scanf("%s",input);

您可以使用

gets(input);

它是cstring頭文件的功能,並且工作相同。 您可能會遇到問題,因為scanf僅接受以空格分隔的字符串。 gets接受一個完整的單行,因此可以解決您的問題。

希望這會起作用!

EDIT1:剛從評論之一得到它。

使用fgets()代替。 因為gets()不提供緩沖區溢出保護。

正如我在第一條評論中所暗示的那樣,問題是scanf僅讀取以空格分隔的 “單詞”。

這意味着當您輸入一個帶有空格的字符串作為輸入時, scanf會讀取直到該空格的第一部分,並將其余的輸入保留在緩沖區中。 然后,當您在循環中進行輸入時, scanf會發現它不是數字,並且無法從緩沖區中提取輸入,而輸入保持不變,因此循環的下一次迭代scanf將嘗試讀取並解析精確的與上次迭代相同的輸入,導致無限循環。

您的代碼還存在其他問題,例如您實際上沒有檢查scanf失敗(遵循指向scanf (和系列)引用的鏈接並了解返回的內容),並且如果設置了error ,也不會中斷循環。

我絕不建議您使用scanf來輸入多個單詞。 getline()將是輸入整行的最佳選擇(例如Mike Myers 13/04/85),它非常安全。 您還會得到以null結尾的字符串。

您可以使用此功能,例如:

char *input(char *output) 
{
    char *Buffer = NULL;
    size_t size = 0;
    int count = 0;

    printf("%s", output);
    count = getline(&Buffer, &size, stdin);
    Buffer[count-1] = '\0';
    return Buffer;
}

在您的情況下,最好像這樣使用它:

s1->name=input("Enter the name");
s1->birthday=input("Enter the birthday");

或者,您可以輸入整行並使用strtok()對其進行解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM