Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在按enter键或在数组边界内读取字符串_C - Fatal编程技术网

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);