2017-06-23 65 views
1

我正在修改我的基本C为即将到来的测验做准备,当时我正在编写一个函数来简单地接受一个字符输入并将其存储到结构中并再次打印出来。编译没有任何问题,但我不断收到合理的问题。我该如何解决?printf和scanf的逻辑问题

#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; 
} 

如果我把“1”,INT,输出将是“年龄是:0'

+0

'的scanf( “%S”,&name);'=>'的scanf( “%C”,&name);'' – Stargateur

+2

scanf的(” %s“,&name);' - 您应该[阅读'%s'格式说明符的要求。](http://en.cppreference.com/w/c/io/fscanf)。您没有提供适当的金额用于读取名称字符串的空间 – WhozCraig

+0

良好的旧缓冲区溢出永远不会写入长度未知的C字符串从不 –

回答

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

请不要在答案中显示缓冲区溢出代码。 '%s'需要一个字段宽度,在这种情况下'%9s' - 为什么有这样一个* tiny *缓冲区呢? –

+0

你有没有跑过这段代码.. ??它为me.check解释工作,如果你想要玩家的商店名称,那么你要求字符数组不是单个字符。 – suraj

+0

输入* christopher-montgomery-joseph *作为名称,看看会发生什么。 'scanf(“%s”,...)'**总是**缓冲区溢出。永远不要写这个。 –

0

您正在使用字符数据类型来输入字符串“char name”,这会导致您导致未定义的行为。

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

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