我想通过键盘读取字符串以避免缓冲区溢出。我用的时候
fgets(text,30,stdin)
,它读取但它也读取'\ n'字符。但我不想读'\ n'字符。
答案 0 :(得分:2)
char s[30];
scanf("%30[^\n]", s);
一点解释:
<强> 30%[^ \ n]的强>
30
这意味着最多读取30个字符[^\n]
,这意味着读取除“\ n”之外的所有字符。
答案 1 :(得分:1)
一旦你有了字符串,就删除换行符:
int get_line(char *buffer, size_t max)
{
if(fgets(buffer, max, stdin) == buffer)
{
size_t len = strlen(buffer);
if(len > 0 && buffer[len - 1] == '\0')
buffer[--len] = '\0';
return len;
}
return 0;
}
UPDATE :更改为返回长度,这可能会给调用者带来一些麻烦。这意味着对于空字符串输入,它将返回0。
答案 2 :(得分:0)
使用'\n'
字符进行阅读,但之后将其删除
if (fgets(text, 30, stdin)) {
size_t tlen = strlen(text);
if (len > 0) {
if (text[tlen - 1] == '\n') {
text[--tlen] = 0;
} else {
/* fgets read all it could
** but there wasn't a '\n'
** for the number of bytes available */
}
} else {
/* empty string read: not even a '\n' */
}
} else {
/* fgets failed */
}