2015-09-06 53 views
-2
#include <iostream> 
#include<cstdio> 
#include<string> 
#include<cstdlib> 

using namespace std; 
struct addr   
char name[30];  
char street[30]; 
long int ph_num; 
}; 
int main() 
{ 

addr person[2]; 
int a; 
for(int n=0;n<2;n++) 
{ 
    puts("Enter name of person"); 
    fgets(person[n].name,30,stdin); 
    a=(strlen(person[n].name)-1); 
    if(person[n].name[a]=='\n') 
{ 
    person[n].name[a]='\0'; 
} 
    puts(person[n].name); 
    puts("Enter street of person"); 
    fgets(person[n].street,30,stdin); 
a=(strlen(person[n].street)-1); 
if(person[n].street[a]=='\n') 
{ 
    person[n].street[a]='\0'; 
} 
    puts(person[n].street); 
    puts("Enter ph of person"); 
    scanf("%ld",&person[n].ph_num); 
    printf("%ld",person[n].ph_num); 

} 

return 0; 
} 

這段代碼工作正常只有第一次,但之後的第一個,在第二次迭代我不能寫的人名(跳過直接到person [n] .name)。我不能不知道可能是什麼問題,儘管我猜它可能與fgets函數的工作方式有關。如何讀取多個使用字符串與fgets()

請不要投票,這可能看起來微不足道,但它是我面臨的一個問題,太多的投票將使我無法提出進一步的問題。 你可以發表評論,如果這個問題真的是多餘的,天真或微不足道的,但我不會投票,我會留意刪除這個問題。 謝謝。

回答

0

您發佈的代碼缺少struct addr的聲明,但我想這只是一種類型(它不會編譯)。

此行爲可能是由fgets和流輸入讀取器cin的混合使用引起的。您的程序中只能使用其中的一種,因爲它們的行爲完全不同。試着用

fgets(person[n].ph_num, 30, stdin); 
+0

我正在回答這個問題,儘管謙遜的請求傢伙已經投了票。 –

2

要麼更換cin >> person[n].ph_num;使用fgets()閱讀一切,或使用cin >> ...噸讀到的一切。不要混合它們。雖然可以將它們混合使用,但有許多問題 - 例如您所看到的 - 這樣做。

例如,...

  • 貴公司的所有輸入以一致的方式。如果使用fgets()來讀取某些內容,請使用fgets()來讀取所有內容,並且不要在同一個流中使用C++流提取(運算符>>等)。原因是他們以不同方式處理諸如換行符之類的事情 - 例如,流提取可能會留下換行符,並且隨後的調用fgets()將立即遇到它,並立即返回(並且不會讀取數據,如您所見)。
  • 雖然是C的 stdin之間的關係,並同步C++ std::cin,這是一個好主意,用一個或另一個 ,而不是混合使用它們,因爲它們每一個緩衝區中的數據不同 - 而且,根據系統如何管理數據流,還是其他函數stdinstd::cin或其 緩衝區的程序集屬性如何,它們之間可能會有類似的意外交互。
+0

在使用c風格的i/p後,問題仍然存在。我仍然無法在第二次迭代中寫人名。 –

+0

因此,改變你的代碼,並避免在使用'fgets(....,stdin)'後立即使用'cin >> ...'。例如,使用'fgets()'執行'stdin'的所有讀取,並根據需要解釋數據(作爲名稱,街道,數字)。另外請記住,從'stdin'讀取不一定需要'std :: cout'。 – Peter

+0

我必須使用fflush(stdin);刷新標準輸入流以按預期執行程序。 –