gpt4 book ai didi

c - printf 和 fgets 不删除换行符

转载 作者:太空宇宙 更新时间:2023-11-04 03:16:54 25 4
gpt4 key购买 nike

当我把 "four" 放在第一个 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);
}

最佳答案

When I put "four" in after the first printf, then I can't write in the second printf.

用户不仅输入了four,还输入了enter。所以真正的输入是“四\n”的5个字符。

下面的代码只会将4个字符读入buffer[5],将'\n"留在stdin中用于下一个fgets()fgets() 读取小于 5 的一个,为附加的空字符留出空间。

char buffer[5]= {0};
fgets(buffer,sizeof(buffer),stdin);

避免缓冲区太小,建议使用最大预期大小的 2 倍。例如。 longest name

#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

避免黑客攻击。如果恶意用户输入一个空字符作为第一个字符,下面肯定是 UB。 Ctrl @our输入

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`

关于c - printf 和 fgets 不删除换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50613839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com