C printf和fgets don';不要拆下断线

C printf和fgets don';不要拆下断线,c,C,当我在第一个printf之后放入“四个”时,第二个printf就无法写入了 为什么会发生这种情况 #include <stdio.h> #include <string.h> int main() { char buffer[5]= {0}; char buffer2[5]= {0}; printf("Put your name: "); //i put four fgets(buffer,sizeof(buffer),stdin);

当我在第一个
printf
之后放入
“四个”
时,第二个
printf
就无法写入了

为什么会发生这种情况

#include <stdio.h>
#include <string.h>

int main() {
    char buffer[5]= {0};
    char buffer2[5]= {0};

    printf("Put your name: "); //i put four
    fgets(buffer,sizeof(buffer),stdin);
    size_t len = strlen(buffer)-1;

    if (buffer[len] == '\n')
        buffer[len] = '\0';

    printf("Put your second name: ");
    fgets(buffer2,sizeof(buffer2),stdin);
    printf("%s",buffer2);
}
#包括
#包括
int main(){
字符缓冲区[5]={0};
char buffer2[5]={0};
printf(“写上你的名字:”;//我写了四个
fgets(缓冲区、sizeof(缓冲区)、stdin);
大小长度=strlen(缓冲区)-1;
如果(缓冲区[len]='\n')
缓冲区[len]='\0';
printf(“输入您的第二个名字:”);
fgets(buffer2,sizeof(buffer2),stdin);
printf(“%s”,缓冲区2);
}
当我在第一个printf后面加上“四”时,第二个printf就不能写了

用户不仅要输入4,还要输入。因此,真正的输入行是5个字符的
“四\n”

以下代码只将4个字符读入
缓冲区[5]
,将
'\n“
保留在
stdin
中,以便下一个
fgets()
fgets()
读取一个小于5的字符,为附加的空字符留出空间


避免缓冲区太小,而是建议最大预期大小的2倍


避免黑客攻击。如果恶意用户输入一个空字符作为第一个字符,请执行以下操作。Ctrl@ourenter

反而

size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
  buffer[--len] = '\0';
}

// Now use `buffer and `len`

请查看您的名字和第二个名字可能超过3个字符(5个字符包括换行符和字符串终止符)。如果第一个较长,则多余的部分不会被丢弃,而是读入第二个
fgets
。不要吝啬于您的缓冲区大小。据我所知,您首先输入的是4个字符的名称,例如4个字符,因此缓冲区只有5个字符(包括终止符)尾随的换行符被读取为第二个输入,因此第二个
printf
当然不会显示任何内容。
size\t len=strlen(buffer)-1;
strlen()可以返回零。
#define NAME_MAX 585
#define BUF_SIZE ((NAME_MAX + 1 /* \n */ + 1 /* \0 */)*2)
char buffer[BUF_SIZE] = {0};
printf("Put your name: ");  
if (fgets(buffer,sizeof buffer,stdin)) {
  // process buffer only if `fgets()` succeeds
size_t len = strlen(buffer)-1;
if (buffer[len] == '\n')
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
  buffer[--len] = '\0';
}

// Now use `buffer and `len`