C 打印多个字符串(%s)时为什么printf()离开换行符以及如何解决此问题?

C 打印多个字符串(%s)时为什么printf()离开换行符以及如何解决此问题?,c,arrays,string,printf,C,Arrays,String,Printf,我制作了一个接受字符串(名字/姓氏)的程序,但是我得到的不是Phil Snowken age 3的典型输出,而是Phil 斯诺肯 3岁 #include <stdio.h> #define N 10 struct data{ char fname[30]; char lname[30]; int age; }; main() { int i; struct data base[N]; for(i=0;i<N;i++){ printf("

我制作了一个接受字符串(名字/姓氏)的程序,但是我得到的不是Phil Snowken age 3的典型输出,而是Phil
斯诺肯
3岁

#include <stdio.h>
#define N 10
struct data{
char fname[30];
char lname[30];
int age;
};

main()
{
    int i;
    struct data base[N];
    for(i=0;i<N;i++){
        printf("\n-------------------------");
        printf("\nPeople Data(%d remaining)\n",N-i);
        printf("---------------------------\n\n");
        printf("\nFirst Name ");
        fgets(base[i].fname,30,stdin);
        printf("\nLast Name ");
        fgets(base[i].lname,30,stdin);
        printf("\nAge ");
        scanf(" %d",&(base[i].age));
        fflush(stdin);
    }

    for(i=0;i<N;i++)
        printf("%s %s Year:(%d)",base[i].fname,base[i].lname,base[i].age);
    return 0;   
}
#包括
#定义n10
结构数据{
char-fname[30];
字符名称[30];
智力年龄;
};
main()
{
int i;
结构数据库[N];
for(i=0;i
fgets()
读取输入字符串的换行符,因此每次按enter键时,它都会将
\n
读入字符串(请参阅)

您必须检查最后一个字符,如果它是
\n
则将其更改为
\0
,如下所示:

size_t length = strlen(base[i].fname);
if (base[i].fname[length-1] == '\n')
    base[i].fname[length-1] = '\0';

这可能是编译器的问题,我不确定
fgets()
从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。读取在EOF或换行后停止。如果读取了换行,则将其存储到缓冲区中。删除
fflush(stdin)
。它调用未定义的行为。@haccks:不是一个操作系统,它是一个标准的“便携式操作系统接口”。Linux和UNIX系统符合POSIX,或者至少尝试这样做。所以是的,
fflush(stdin)
定义了行为(由POSIX和操作系统定义,但不是由ISO C标准定义)在基于Linux和基于UNIX的系统上,假设它们充分符合POSIX。然而,使用它不是一个好主意。注意:在
scanf(“%d”,&(base[i].age));
之前的空格是不需要的。把它放在那里没有坏处,只是它是多余的。
%d”
占用了主要的空白。如果我将
length
声明为
int
,怎么样?@niCk它会起作用,但是你可能会收到编译警告,因为
strlen
返回
size\u t
@prajmus:有一个从
size\u t
int
的隐式转换,所以不太可能出现警告。niCk:但是你为什么要将
长度
声明为
整数
?它可能不会引起任何问题,但如果它是
大小
@KeithThompson,那就更有意义了。我没有读过那么多关于大小的书,因此无法在考试中证明它是正确的,而且我还被限制在允许使用的库中use@niCk当前位置prajmus公司正确--但是如果您更习惯于使用
int
,它就没有那么干净了,但是对于这样一个介绍性的示例程序来说,它是可以的。