printf和scanf的逻辑问题

问题描述 投票:1回答:3

我正在修改我的基本C来准备即将进行的测验,当我编写一个函数来简单地获取一个字符输入并将其存储到一个结构中并再次打印出来。编译没有任何问题,但我不断遇到逻辑问题。我该如何解决?

#include <stdio.h>

struct player
{
    char letter;
    int age;
    double avg;
};

int main()
{
    struct player P1;
    char name;
    int age;
    double avg;
    printf("Enter age: ");
    scanf("%d", &age);
    printf("Enter avg: ");
    scanf("%lf", &avg);
    printf("Enter name: ");
    scanf("%s", &name);

    P1.letter= name;
    P1.avg = avg;
    P1.age = age;
    printf("\n Age is: %d \n", P1.age); 
    printf("Avg is: %lf", P1.avg);
    printf(" \n Name is: %c \n", P1.letter);
    return 0;
}

如果我为int输入'1',输出将是“Age is:0”

c struct printf scanf
3个回答
0
投票

你正在努力获得名字,年龄和平均值。玩家所以要存储名称,你应该声明一个数组而不是一个字符。并且为了将名称赋值给结构变量,请使用strcpy()。(直接赋值不起作用)。或者,如果您只将一个字符作为名称,则写入scanf,如下所示:

scanf("%c", &name);

检查下面的代码,它会帮助你,

#include <stdio.h>

struct player
{
    char letter[10];
    int age;
    double avg;
};

int main()
{
    struct player P1;
    char name[10];
    int age;
    double avg;
    printf("Enter age: ");
    scanf("%d", &age);
    printf("Enter avg: ");
    scanf("%lf", &avg);
    printf("Enter name: ");
    scanf("%s", &name);

    strcpy(P1.letter,name);
    P1.avg = avg;
    P1.age = age;
    printf("\n Age is: %d \n", P1.age);
    printf("Avg is: %lf", P1.avg);
    printf(" \n Name is: %s \n", P1.letter);
    return 0;
}

0
投票

您正在使用字符数据类型输入字符串,“char name”将引导您进行未定义的行为。

而不是你声明一个像这个“char name [10]”的字符数组,然后读取名称。但是在分配时你必须注意不能直接分配你必须像这样使用strcpy。

strcpy(p1.letter,name)(这里的字母也是字符数组)


0
投票

两个快速建议:

1)除非您确定name缓冲区仅填充短名称(9个或更少字符),否则请为缓冲区选择更合理的大小,例如:

char name[100]; 

这还需要延长结构中的成员letter

2)当使用scanf()读入变量时,正在读取的变量的地址作为第二个参数传递。对于诸如int a;float b;之类的变量,您必须使用运算符的地址:&作为变量的前缀。但是因为C字符串的变量名指向数组中的第一个字符,所以它已经是该变量的地址。因此,在将C字符串读入&函数时,您不需要显式的scanf()运算符。还应使用函数的返回值来确定调用是否成功。更改以下行,如下所示:

scanf("%s", &name);
int count = scanf("%s",  name);//note: use return value of function
//  remove &            ^
if(count < 0)
{
    //handle error
}
© www.soinside.com 2019 - 2024. All rights reserved.