簡體   English   中英

在c的循環內掃描具有空白的字符串,並創建一個完美的表

[英]scan a string with empty space within loop in c and create a perfect table

當我輸入帶有空白空間的設備名稱時,它將退出。 我嘗試將其更改為fget,然后在下一個循環時將跳過“輸入設備名稱。我也嘗試過”%[^ \\ n] s”,它也做同樣的事情。

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

struct deviceType
{
    char cName[20];
    float fPrice;
    int iQty;
    float fTotal;
};
void fnKeyIn(float*,int*);
float fnCalcTotal(const float,int);
void fnGetDiscount (const float,double*);
float fnAfterDiscount(const float,double);
void fnPrint(struct deviceType ,double,const float);

int main()
{
    struct deviceType asEntertaiment[50] ;
    char ans;
    int n,i=0;
    double afDiscount[i];
    float afAfterDiscount[i];
    float full = 0;

    do{
        printf("\nEnter device name: ");
        //gets(asEntertaiment[i].cName);
        scanf("%s",asEntertaiment[i].cName);
        getchar();

        fnKeyIn(&asEntertaiment[i].fPrice,&asEntertaiment[i].iQty);

        printf("\nDo you want to add more?\n");scanf("%s",&ans);

        i++;n=i;

    }while((ans=='Y')||(ans=='y'));

  printf("\nDevices         Price  Quantity  Total  Discount After Discount\n");

        for(i=0;i<n;i++)
        {
            asEntertaiment[i].fTotal = fnCalcTotal(asEntertaiment[i].fPrice,asEntertaiment[i].iQty);

            if(asEntertaiment[i].iQty>=50)
                {
                    fnGetDiscount (asEntertaiment[i].fTotal,&afDiscount[i]);
                }
            else
                {
                    afDiscount[i]= 0;
                }

            afAfterDiscount[i] = fnAfterDiscount(asEntertaiment[i].fTotal,afDiscount[i]);
            full=full + afAfterDiscount[i];
            fnPrint(asEntertaiment[i],afDiscount[i],afAfterDiscount[i]);

        }

    printf("\nTotal amount payable: %3.2f",full);

    return 0;
}
    void fnKeyIn(float *price,int *quantity)
        {
            printf("\nEnter device price: RM ");
            scanf("%f",price);

            printf("\nEnter quantity ordered: ");
            scanf("%d",quantity);
        }
    float fnCalcTotal(const float Price,int Qty)
        {
            return(Price*Qty);
        }
    void fnGetDiscount (const float Total,double *Discount)
        {
            *Discount=Total*0.1;
        }
    float fnAfterDiscount(const float Total,double Discount)
        {
            return(Total-Discount);
        }
    void fnPrint(struct deviceType E,double Discount,const float After)
        {
            printf("\n%s %3.2f    %d      %3.2f   %3.2lf       %3.2f    ",E.cName,E.fPrice,E.iQty,E.fTotal,Discount,After);
        }

scanf()函數將不需要的任何字符保留在輸入流中,這在您的情況下意味着用戶在第一個單詞之后輸入的所有字符仍在輸入流中。 您可以像這樣丟棄這些字符:

printf("\nEnter device name: ");
//gets(asEntertaiment[i].cName);
scanf("%s",asEntertaiment[i].cName);
while (getchar() != '\n')
    continue;              // discard extra characters

如果您真的想掩蓋自己的基礎,則可以執行以下操作:

int ch;
while((ch = getchar()) != '\n' && ch != EOF)
    continue;

如果要測試EOF ,則必須使用int或帶符號的整數類型: char是無符號的。

要獲取多個單詞的輸入,請嘗試使用fgets()讀取直到第一個換行符的字符或最大字符數,以先到者為准:

printf("\nEnter device name: ");
//gets(asEntertaiment[i].cName);
fgets(asEntertaiment[i].cName, 50, stdin);
int find = 0;
while (find < 49 && (asEntertaiment[i].cName)[find] != '\n')
    ++find;
if (find == 49) {
    while (getchar() != '\n')
        continue;              // discard extra characters
    }
(asEntertaiment[i].cName)[find] = '\0';

如果用戶鍵入的設備名稱超過49個字符(49個字符+'\\ 0'),則仍然需要清除輸入的額外字符流。 調用fgets()之后,這些額外的字符仍在輸入流中。 這將按原樣工作,但是最好編寫一個函數來處理此輸入,並在需要時進行清理以調用它。

您應該記住,某些輸入函數會在輸入流中留下一些字符,如果您不清理它們,它們只會等待下一個輸入函數。 另外,您應該真正驗證您的輸入。 如果用戶在“輸入設備價格:”提示下輸入字符串而不是數字,則程序會發瘋。 scanf()返回一個int ,它是成功分配的數量。 因此,如果您要求一個int ,並且用戶輸入了一個字符串,則返回值為0。您可以使用它來測試用戶的輸入,如果輸入不正確,可以循環使它們再次輸入。

暫無
暫無

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

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