从标准输入读取字符串的长度

4

我希望能从标准输入中获取一个字符串,但我不想使用固定大小的静态数组。

我知道scanf需要一个位置来保存标准输入的值,但我不能这样做:

char string[10]
scanf("%s",string);

因为我需要知道字符串的长度,以便分配正确的内存空间。

你能帮我解决这个问题吗?


哇喔喔喔喔

我还在被这个问题困扰着......我要疯了

你能给我一个可行的代码吗?

7个回答

2

不要使用scanf,而应该使用fgets,这可以防止读入过多的字符。

char tmp[256]={0x0};
while(fgets(tmp, sizeof(tmp), stdin)!=NULL)
{
    printf("%s", tmp);
}

fgets函数会在行末返回一个'\n',当标准输入关闭或遇到错误时返回NULL。

先试着运行它,看看它的功能。如果需要将输入行分成字段,可以在tmp上使用sscanf(),sscanf的用法与scanf相同,但是作用于字符串。


2
如果您使用fgets(),则如果缓冲区足够大,则最有可能在末尾有一个'\n'字符。一些人可能会通过strtok()函数将其移除,但这是不安全的。
我建议使用以下安全的方法来删除这个特殊字符。
char *get_line (char *s, size_t n, FILE *f)
{
  char *p = fgets (s, n, f);

  if (p != NULL) strtok (s, "\n");
  return p;
}

2
唯一确定的方法是循环读取一个字符并存储。如果已分配的缓冲区已满,请增加适当数量的空间(建议一次增加超过一个字节,以提高性能,经典的经验法则是将其翻倍)。
在考虑字符串终止时停止,例如在换行符或EOF处。

0

您可以使用以下方式逐个字符处理输入数据:

int getc(FILE *stream);

或者

int getchar(void);

0

您可以通过以下方式确保不会超出缓冲区:

   char buffer[128];
   printf("Input Text: ");
   fgets(buffer,127,stdin);

如果您需要可变大小的输入,则只需保持获取相同固定大小的输入即可。


0
您可以使用以下格式字符串:
char string[10];
scanf("%10s" string);

这会强制要求尊重缓冲边界,但需要格式字符串意识到缓冲区的大小。我通常通过声明两者都为常量来解决这个问题:

#define BUFSIZE 10
#define BUFFMT "%10s"

如果你正在使用GNU系统,你也可以利用GNU扩展:getline(3)函数可以避免很多麻烦!请看这里


2
该数组只能安全地存储9个字符以及结尾的NUL '\0'。 - Jonathan Leffler
正确,但只有从标准输入读取了9个字符,所以没问题。 - Dacav

0
如果您不想使用固定大小的静态数组,可以考虑使用动态分配的数组,该数组会根据需要增长。
如果您在Linux或其他支持POSIX 2008的系统上工作,则可以使用(较新的)getline()函数。如果您无法访问此类函数,请考虑使用相同接口自己编写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接