簡體   English   中英

C scanf無法正常工作(幫助!)

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

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