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;
}
4

2 に答える 2

3

あなたのscanfステートメントは間違っています.intの前にアンパサンド演算子を忘れまし&PERSON.age

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

正しいです:

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

コードには、ユーザー 1 から文字列をスキャン名に入力するための 2 つの scanf 雄しべがあります。

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

これは正しく、&前の文字列は必要ありません。しかし、年齢はint.float をスキャンするために、変数の前intに追加する必要があるため、PERSON.age の前にアンパサンドを追加しました。参照:scanf&&

2番:

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*

入力/出力を書式設定する必要がある場合は、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 
于 2013-03-19T02:50:27.673 に答える
1

Grijeshの答えに加えて:

説明してくださいscanf("%s", &ans);。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 */ }. ans に 1 文字だけを読み込む%cに注意してください。

または、 ans を anintに変更すると、次を使用できます。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);
}
于 2013-03-19T03:06:04.730 に答える