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);

您的代码中有两个 scanf 雄蕊,用于从用户一输入字符串以扫描名称。

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

这是正确的,不需要&之前的字符串。但是年龄是int并且要扫描 int.float,您需要&在变量之前添加这就是为什么&在 PERSON.age 之前添加&符号。参考: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*

当您需要格式化输入/输出时更喜欢 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 */ }。注意%c它只会将一个字符读入 ans

或者,如果您将 ans 更改为 an 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);
}
于 2013-03-19T03:06:04.730 回答