我正在创建一个程序,该程序应该创建用户输入的人员列表的结构;我遇到的唯一问题是让用户输入数据出现在文本文件中。有人知道怎么做吗?这是代码:
#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;
}
答案 0 :(得分:3)
你知道scanf语句是错的,你在&
之前忘记了&符号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);
错误的fput语法是:
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
答案 1 :(得分:1)
除了Grijesh的回答:
请解释scanf("%s", &ans);
。你可以在ans中存储多少个字符?字符串&#34; y&#34;需要存储?验证您的信念: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更改为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);
}