Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Struct char成员得到一个奇怪的值_C - Fatal编程技术网

C Struct char成员得到一个奇怪的值

C Struct char成员得到一个奇怪的值,c,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(

我刚开始玩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;
}
#包括
#包括
结构人{
int i;
字符名[100];
};
int main(){
结构人p[2];
clrsc();

对于(int i=0;i您应该使用
%s
打印字符串;
%c
将指针解释为
字符
(严格来说,我认为结果是未定义的行为)。

使用sscanf,因为scanf已被弃用。您还可以使用sscanf读取字符串,而不仅仅是数字。另外,%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");
        sscanf("%d", &p[i].i);

        printf("Enter name:\n");
        sscanf("%s", 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;
}
#包括
#包括
结构人{
int i;
字符名[100];
};
int main(){
结构人p[2];
clrsc();
对于(int i=0;i两件事:

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

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

    您应该改用
    %s
    。表达式
    p[j]。name
    是指向字符数组的指针,因此无法使用
    %c

    打印,您可能需要在键入数字后清除输入缓冲区(在数字后按return,但不读取该返回)

    在调用
    scanf
    后读取
    \n
    之前,您可以一直读取输入流:

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

    您可能需要在键入数字后清除输入缓冲区(在数字后按enter键,但不读取该enter键)你绝对不应该使用
    get
    。你的问题是特定于Windows的。Posix、Linux、MacOS没有
    ,你应该在编译器中启用所有警告。使用GCC,这是通过
    -Wall
    标志完成的。user Mystical正确地解决了问题,但当我刷新页面时,它被删除了。是的,我刚刚做到了,但它仍然存在同样。它从未要求成员“name”。从程序的输出来看,似乎是这样。是的,你说得对。但主要问题是,每当要求char成员输入时,它都会跳转到另一个循环。
    fflush(stdin)
    是未定义的行为。
    fflush
    仅为输出流定义。Hi Mystical,出于某种奇怪的原因,当我接受你的答案时,会弹出一条消息,告诉我你的答案已被删除。因此,我所做的就是用你的答案更新我的问题。thanks@another.anon.coward指出了我犯的错误。所以我删除了给我是时候修正我的答案了。虽然
    fflush(stdin)
    似乎在MSVC中工作,但显然这是标准中未定义的行为。我明白了。我真的很感谢你的帮助。你应该非常确定你写了什么或使用了编译器。
    while( ch = getchar() != '\n' && ch != EOF);