打印从用户获得的 int 值
Printing an int value obtained from user
问题出在 age
部分,编译器没有给我任何错误,但是当我 运行 它打印出一个 random number
for int 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);
这是你的问题。
char gender;
scanf(" %s",&gender);
gender
是一个 char
。也就是说,它只有一个 1 字节字符的内存。但是您将其用作字符串。你可能对 name1
有同样的问题,因为你也在使用 &
但不能确定,因为你没有显示。
将其更改为:
char gender[8] // Enough to fit "Female" and terminating NULL
scanf("%7s", gender);
额外注意:scanf
使用起来有点笨拙,以防止缓冲区安全。可以考虑用 sscanf
代替 fgets
。
还有动态分配,您现在不必指定要使用的存储量。使用长度修饰符 %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
。
问题出在 age
部分,编译器没有给我任何错误,但是当我 运行 它打印出一个 random number
for int 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);
这是你的问题。
char gender;
scanf(" %s",&gender);
gender
是一个 char
。也就是说,它只有一个 1 字节字符的内存。但是您将其用作字符串。你可能对 name1
有同样的问题,因为你也在使用 &
但不能确定,因为你没有显示。
将其更改为:
char gender[8] // Enough to fit "Female" and terminating NULL
scanf("%7s", gender);
额外注意:scanf
使用起来有点笨拙,以防止缓冲区安全。可以考虑用 sscanf
代替 fgets
。
还有动态分配,您现在不必指定要使用的存储量。使用长度修饰符 %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
。