问题出在age
部分,编译器没有给我任何错误但是当我运行它时会为int random number
打印age
printf("Enter your name:");
scanf(" %s",&name1);
int age;
printf("\n\nHow old are you?");
scanf(" %d",&age);
char gender;
printf("\n\nEnter your gender[Male/Female]:");
scanf(" %s",&gender);
char confirmation;
printf("Confirmation: Your name is %s , you are %d years old , and you are a %s.\n\nAnswer[Y/N]:",&name1,age,&gender);
答案 0 :(得分:2)
这是你的问题。
char gender;
scanf(" %s",&gender);
gender
是char
。也就是说,它只有1字节字符的内存。但是你将它用作字符串。您name1
可能会遇到同样的问题,因为您也使用&
,但由于您不能证明这一点,因此无法确定。
将其更改为:
char gender[8] // Enough to fit "Female" and terminating NULL
scanf("%7s", gender);
额外注意:scanf
用于防止缓冲区安全有点尴尬。可以考虑fgets
与sscanf
之类的内容。
答案 1 :(得分:2)
还有动态分配,您现在不必指定要使用的存储量。使用长度修饰符%m
和字符串类型修饰符s
:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *name = NULL
char *gender = NULL;
int age;
printf("Enter your name: ");
scanf("%ms", &name);
printf("\nHow old are you? ");
scanf("%d", &age);
printf("\nEnter gender: ");
scanf(" %ms", &gender);
printf("\n%s %d %s\n", name, age, gender);
free(name); // free the memory
free(gender); //
return 0;
}
在最后几行中,您会注意到对free
的多次调用。这是因为您有责任释放由scanf
分配的内存。
正如@Matt McNabb指出的那样,如果您使用的是非posix兼容系统,这将无效。您可以使用a
代替m
,同时在第一行包含#define _GNU_SOURCE
。