C Struct char成员获得奇怪的值

时间:2012-01-04 17:35:01

标签: c

我刚开始玩C而且遇到了这个问题。这是我的代码:

#include<stdio.h>
#include<conio.h>

struct person {
    int i;
    char name[100];
};

int main() {
    struct person p[2];

    clrscr();
    for(int i=0;i<2;i++) {
        printf("Enter i:\n");
        scanf("%d",&p[i].i);

        printf("Enter name:\n");
        gets(p[i].name);
    }
    for(int j=0;j<2;j++) {
        printf("ID: %d, Name: %c\n", p[j].i,p[j].name);
    }
    getch();
    return 0;
}

以下是输出样本:

enter image description here

问题是,所有的char成员都没有被要求提供价值。

更新:

不过,我正在使用Turbo C ++版本3编译器。

4 个答案:

答案 0 :(得分:4)

你应该用%s打印一个字符串; %c会将指针解释为char。 (严格来说,我认为结果是未定义的行为。)

答案 1 :(得分:3)

两件事:

  1. 您需要清除输入缓冲区以防止它进入换行符。
  2. 其次,您需要将格式字符串更改为%s
  3. 以下是更正后的代码:

    int main() {
        struct person p[2];
    
        for(int i=0;i<2;i++) {
            printf("Enter i:\n");
    
            scanf("%d",&p[i].i);
    
            //  Flush input buffer
            int ch;
            while ((ch = getchar()) != '\n' && ch != EOF);
    
    
            printf("Enter name:\n");
            gets(p[i].name);
        }
        for(int j=0;j<2;j++) {
            printf("ID: %d, Name: %s\n", p[j].i,p[j].name);
        }
        getch();
        return 0;
    }
    

    %c需要char,但您尝试传入字符串。具有不匹配类型的行为是未定义的行为。

    输出:

    Enter i:
    1
    Enter name:
    asdf
    Enter i:
    2
    Enter name:
    zxcv
    ID: 1, Name: asdf
    ID: 2, Name: zxcv
    

答案 2 :(得分:1)

您可能需要在输入数字后清除输入缓冲区(在数字后按回车键,但是您没有读取该数字)

在您致电\n后阅读scanf之前,您可以阅读输入流:

while( ch = getchar() != '\n' && ch != EOF);

答案 3 :(得分:0)

您应该使用%s代替。表达式p[j].name是一个字符数组的指针,因此您无法使用%c进行打印。