2013-03-19 67 views
0

我正在創建一個程序,該程序應該創建用戶輸入的人員列表的結構;我遇到的唯一問題是讓用戶輸入數據出現在文本文件中。有人知道怎麼做嗎?下面是代碼:用戶輸入到文件

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

struct person{ 
    char name[20]; 
    int age; 
    struct person *next_ptr; 
    } PERSON; 

int main (void){ 


struct person PERSON; 

FILE *fp; 
char ans, ch; 
int ppl=0; 

fp=fopen("person_struct", "w"); 

if(fp != NULL){ 

while(ppl<25){ 


printf("Would you like to add a person to the list? [y/n] "); 
scanf("%c", &ans); 

if(ans == 'y') { 
    printf("\nEnter a name:\n"); 
    scanf("%s", PERSON.name); 
    fprintf(fp, "%s",PERSON.name); 
    printf("\nEnter age:\n"); 
    scanf("%i", &PERSON.age); 
    fprintf(fp, " %i\n", PERSON.age); 
} 
else { 
    ppl=25;  
} 

ppl++; 
} 
fclose(fp); 
} 
printf("\n\n\n"); 
system("pause"); 
return 0; 
} 

回答

3

又餓scanf的說法是錯誤的,你PERSON.age之前忘記符號&運營商的INT

scanf("%i", PERSON.age); 
     ^& missing 

正確的是:

scanf("%i", &PERSON.age); 

你有兩個scanf的雄蕊您代碼從用戶輸入字符串到掃描名稱。

scanf("%s", PERSON.name); 

這是正確的,不需要&之前的字符串。但是年齡是int並且要掃描int.float,您需要在變量之前添加&,這是爲什麼在PERSON.age之前添加&符號&。 REF:scanf

二:

fputs(PERSON.age, fp);是的fputs的錯誤的語法是:

int fputs(const char *str, FILE *stream); 
       ^you are passing int 

第一個參數應該是const char*,但你是路過int

fputs(PERSON.age, fp); 
    ^wrong , age is int not char* 

當你需要格式化inp UT /輸出喜歡的printf和scanf函數,我的建議是改變你的讀/寫,如:(閱讀評論

printf("Enter a name:\n"); 
scanf("%s", PERSON.name); // here is No & because `name` is string 
scanf("%i", &PERSON.age); // age is `int` so & needed 
fprintf(fp,"%s %i\n",PERSON.name, PERSON.age); 

編輯:因爲你評論,你的代碼是這些整改工作後,看到

$ gcc x.c -Wall 
$ ./a.out 
Would you like to add a person to the list? [y/n]y 
Enter a name: 
yourname 
14 
Would you like to add a person to the list? [y/n]y 
Enter a name: 
firendName 
15 
Would you like to add a person to the list? [y/n]n 
sh: 1: pause: not found 
$ cat person_struct.txt 
yourname 14 
firendName 15 
+0

...,爲什麼是否需要&符號?如果您要解釋這一點,請確保完全解釋它,以免人們感到困惑,並開始在'scanf(「%s」,PERSON.name);'中的PERSON.name之前添加&符號一個指針。一個不太多餘的方法是鏈接到[scanf手冊](http://pubs.opengroup.org/onlinepubs/007904975/functions/fscanf.html)並詢問「哪個類型對應於'%i '格式說明符?「。 – Sebivor 2013-03-19 02:59:58

+0

仍然無法使用;當我添加符號時,該程序在進入年齡之後崩潰。 – user2184761 2013-03-19 03:00:13

+0

@modifiablelvalue是的,你是正確的我應該加上這一點很重要這裏 – 2013-03-19 03:02:33

1

除了Grijesh的回答是:

請解釋scanf("%s", &ans);。你可以存儲多少個字符?字符串「y」需要存儲多少個字符?驗證你的信念:printf("sizeof ans: %zu\n" "sizeoof \"y\": %zu\n", sizeof ans, sizeof "y");

也許你的意思是:if (scanf("%c", &ans) != 1) { /* assume stdin has closed or reached EOF */ }。請注意0​​,其中將只讀取一個字符到ans

另外,如果你改變ANS到int,您可以使用:ans = getchar();

編輯:總之,我認爲你的循環應該是這個樣子:

for (size_t ppl = 0; ppl < 25; ppl++){ 
    int ans; 

    printf("Would you like to add a person to the list? [y/n]"); 
    do { 
     ans = getchar(); 
    while (ans >= 0 && isspace(ans)); 

    if (ans != 'y') { 
     break; 
    } 

    printf("Enter a name:\n"); 
    if (scanf("%s", PERSON.name) != 1 || scanf("%i", &PERSON.age) != 1) { 
     break; 
    } 
    fprintf(fp, "%s %i\n", PERSON.name, PERSON.age); 
} 
+0

是謝謝添加我的回答:) – 2013-03-19 03:13:37

+0

如果我將scanf(「%s」,&ans);更改爲scanf(「%c」,&ans),循環將只有經過一次 – user2184761 2013-03-19 03:14:33

+0

@ user2184761那麼,至少'scanf(「%c」,&ans)'不是未定義的行爲,爲什麼你認爲循環只能經歷一次?你認爲這是因爲ans包含的東西不是't'y'?這個字符是什麼?你認爲當你遇到諸如''\ n''這樣的空白時(例如'isspace(ans)'),你可能需要'繼續';'再次循環?' – Sebivor 2013-03-19 03:18:47