C 在按enter键或在数组边界内读取字符串
我想通过键盘读取字符串以避免缓冲区溢出。当我使用C 在按enter键或在数组边界内读取字符串,c,C,我想通过键盘读取字符串以避免缓冲区溢出。当我使用 fgets(text,30,stdin),它可以读取,但也可以读取'\n'字符。但是我不想读取'\n'字符。因此,一旦有了字符串,就删除换行符: int get_line(char *buffer, size_t max) { if(fgets(buffer, max, stdin) == buffer) { size_t len = strlen(buffer); if(len > 0 && buf
fgets(text,30,stdin)
,它可以读取,但也可以读取'\n'字符。但是我不想读取'\n'字符。因此,一旦有了字符串,就删除换行符:
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;
}
更新:更改为返回长度,这可能会为调用者节省一些麻烦。这意味着对于空字符串输入,它将返回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 */
}
请稍作解释:
%30[^\n]
30
表示最多读取30个字符,[^\n]
表示读取除“\n”以外的任何字符。为什么不返回长度?如果您返回它,调用者将不需要再次调用strlen。@pmg:当然,已更改。这使得调用者无法知道读取是否失败,或者用户是否只是输入了一个空字符串。我不明白通过键盘读取(与其他数据源相反)如何避免缓冲区溢出。@Tomalak Geret'kal::听起来像这样,或者框框错误,我不认为OP
意味着。应该是scanf(“%29[^\n]”,s)
。。。而且,与fgets
不同,'\n'
在下一次输入操作中未被读取。:没有回答问题,scanf
容易发生缓冲区溢出。@Acme:%29[^\n]数字29告诉scanf将最多29个字符读入s
Oops.,完全忽略了这一点。。很抱歉。
char s[30];
scanf("%30[^\n]", s);