2016-04-23 39 views
0

我被要求製作一個C程序,用作'價格查詢',用戶輸入產品名稱,程序將打印出存儲在文件中的名稱和價格。如果該項目不存在於該文件中,該程序將讓用戶知道。只要用戶想要搜索,程序就會保持循環。我使用Dev C++編寫了代碼,但是在運行代碼之後,程序在幾次循環後卡住了,並且是隨機的。你們可以檢測到我的編碼有問題,還是僅僅是Dev C++的問題?我在下面列出了我的代碼。非常感謝您的幫助。C - 價格查詢程序

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<conio.h> 
#include<ctype.h> 

int main() 
{ 
    FILE *items; 
    char *mode="r"; 
    char pName[50]; 
    float pPrice; 
    char p1Name[50]; 
    int value=0; 
    char respond='Y'; 
    char s[50]; 

    items=fopen("Product_Name_Price.txt", mode); 

    if(items==NULL) 
    { 
     fprintf(stderr, "Can't open file Product_Name_Price.txt!\n"); 
     exit(1); 
    } 

    printf("File has been successfully opened\n"); 

    do 
    { 
     printf("Enter the name of the product you wish to look for\n"); 
     scanf("%s", &p1Name); 

     while(strcmp(p1Name, pName) !=0) 
     { 
      fscanf(items,"%s %f", pName, &pPrice); 

      //printf("%s\t%.2f\n", pName, pPrice); 

      //value=strcmp(p1Name, pName); 

      if(strcmp(p1Name, pName) == 0) 
      { 
       printf("%s\t%.2f\n", pName, pPrice); 
      } 
     } 

     /* 
     else 
     { 
      printf("No data in system\n"); 
     } 
     */ 

     printf("Do you wish to look up for more item? (Y/N)\n"); 
     scanf("%s", &respond); 

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

    printf("This program is closing\n"); 

    fclose(items); 
} 
+1

scanf%s用於字符串,%c用於字符。未定義的行爲造成的隨機事件。 – Unimportant

+0

這是一個C程序或C++程序嗎?選一個_。 (如果它是一個C++程序,爲什麼你用C語言編寫並使用C特性?) –

+0

我正在c程序中完成它。 –

回答

3

程序具有不確定的行爲,因爲你scanf("%s", &response)讀入response,就好像它正在讀取—足夠大的尺寸爲字符串的數組大小至少 2(包括空終結符),但response是隻是一個個性。你炸燬你的籌碼和損壞的內存,然後所有的投注都關閉。

你可以編寫scanf("%c", &response)來實際讀取單個字符,但是如果你正在編寫C++程序,你最好轉換到更現代,更安全的工具。

+0

我的確從%s變爲%c,並且忽略了y/n問題的scanf。你知道爲什麼嗎? –

+0

@SafiuddinMansor:它不會「忽略」任何東西。你可能需要吃掉尾隨的換行符。請在提問前進行一些調查。 –