[英]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.