打印从用户获得的int值

时间:2015-05-31 21:16:56

标签: c printing int scanf

问题出在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);

2 个答案:

答案 0 :(得分:2)

这是你的问题。

char gender;
scanf(" %s",&gender);

genderchar。也就是说,它只有1字节字符的内存。但是你将它用作字符串。您name1可能会遇到同样的问题,因为您也使用&,但由于您不能证明这一点,因此无法确定。

将其更改为:

char gender[8] // Enough to fit "Female" and terminating NULL
scanf("%7s", gender);

额外注意:scanf用于防止缓冲区安全有点尴尬。可以考虑fgetssscanf之类的内容。

答案 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