[英]C scanf not working as intended (Help!)
正在使用一個程序提示用戶輸入電話號碼,然后使用將其打印出來。 而不是-因此,當我運行它時,它甚至不讓我輸入任何東西,它只是運行並為我提供隨機值。 因此,這里是整個程序的外觀。
int item_number, year, month, day, first, middle, last;
//float unit_price;
printf("Enter item number: ");
scanf("%d", &item_number);
printf("Enter unit price: ");
scanf("%f", &unit_price);
printf("Enter purchase date (mm/dd/yyyy): ");
scanf("%d /%d /%d", &month, &day, &year);
printf("Item\t\tUnit\t\tPurchase\n\t\tPrice\t\tDate");
printf("\n%d\t\t$%6.2f\t\t%.2d/%.2d/%.2d\n", item_number, unit_price, month, day, year);
//here is the code that gives me the problem explained above.
//also if i comment the code above it works.
printf("Enter phone number [(xxx) xxx-xxxx] : ");
scanf("(%d) %d - %d", &first, &middle, &last);
printf("You entered %d.%d.%d", first, middle, last);
您遇到的問題可能是新C程序員遇到的最常見的問題之一scanf
使用不當。 具體來說,當您嘗試讀取電話號碼時, stdin
包含例如:
"\n(888) 555-1212"
( 輸入 (mm/dd/yyyy)
后按Enter的'\\n'
結果)
其結果是,輸入等待stdin
不匹配"(%d..."
,和匹配失敗的結果。為什么?還有就是在字符的開始換行 stdin
。在"%d"
格式說明 (所有數字轉換說明符 )將跳過前導空格。
然而, 領先的空白並不先於整數 ,它先於"("
這是不是你的格式字符串跳過。隨着scanf
,一個" "
跳過( 空間 )在格式字符串 ,就會引起很多的空白字符因此,正如BLUEPIXY正確指出的那樣,您需要在格式字符串中的"("
之前添加空格 ,以使scanf
忽略stdin
等待的'\\n'
。
除此之外,您幾乎和所有新的C程序員一樣都會犯同樣的錯誤和對scanf
濫用- 無法檢查 return 。 scanf
根據格式字符串中的轉換說明符返回成功轉換的次數。
至少,您必須檢查scanf
的返回(實際上是在ALL USER INPUT函數上),以提供最小的驗證,即您確實在變量中存儲了有效輸入,以便繼續在代碼中進行操作。 如果您無法檢查返回值,則無法確定從那時起未調用未定義的行為。 因此,請驗證所有用戶輸入 。
將這些部分放在一起的最小代碼重寫是:
#include "stdio.h"
int main (void) {
int item_number, year, month, day, first, middle, last;
float unit_price;
printf("Enter item number: ");
if (scanf ("%d", &item_number) != 1) { /* validate item */
fprintf (stderr, "error: invalid input (item_number)\n");
return 1;
}
printf("Enter unit price: ");
if (scanf ("%f", &unit_price) != 1) { /* validate unit */
fprintf (stderr, "error: invalid input (unit_price)\n");
return 1;
}
printf("Enter purchase date (mm/dd/yyyy): ");
/* validate date */
if (scanf ("%d /%d /%d", &month, &day, &year) != 3) {
fprintf (stderr, "error: invalid input (mm/dd/yyyy)\n");
return 1;
}
printf ("\t\tUnit\t\tPurchase\nItem\t\tPrice\t\tDate");
printf ("\n%d\t\t$%6.2f\t\t%.2d/%.2d/%.2d\n",
item_number, unit_price, month, day, year);
printf ("Enter phone number [(xxx) xxx-xxxx] : ");
/* validate phone */
if (scanf (" (%d) %d - %d", &first, &middle, &last) != 3) {
fprintf (stderr, "error: invalid input [(xxx) xxx-xxxx]\n");
return 1;
}
printf ("You entered %d.%d.%d\n", first, middle, last);
return 0;
}
使用/輸出示例
$ ./bin/scanf_phone
Enter item number: 3
Enter unit price: 19.95
Enter purchase date (mm/dd/yyyy): 03/01/2017
Unit Purchase
Item Price Date
3 $ 19.95 03/01/2017
Enter phone number [(xxx) xxx-xxxx] : (800) 555-1212
You entered 800.555.1212
( 請注意,我調整了格式以將Item
放在第二行...)
仔細研究一下,並花費時間來理解man 3 scanf 。 時間花得很充裕。
如果您使用的是Xcode,請像下面這樣編寫printf語句:
printf("Enter item number:\n");
在末尾添加換行符(\\ n)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.