打印从用户获得的 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