这是处理C语言中用户输入的两个示例。
1.扫描
此方法很容易受到缓冲区溢出的攻击,请尝试输入一些字符,这些字符要比您声明的有关缓冲区溢出的经历更多。
#include
#include
int main()
{
char bStr[80];
printf("\nEnter a very very very long String value:");
scanf("%s", bStr);
printf("\nLong String value:%s \n\n",bStr);
return 0;
}
2. fgets
此方法可以通过限制字符用户输入来保护缓冲区溢出。
#include
#include
int main()
{
char bStr[80];
printf("\nEnter a very very very long String value:");
fgets ( bStr, 80, stdin );
printf("\nLong String value:%s \n\n",bStr);
return 0;
}
但是,以上两种方法只能处理普通的用户输入, 我要如何处理1000个甚至更多字符的用户输入呢? 是的,我们可以声明为“ char bStr[1000]
”或更大的尺寸,但这不够动态和灵活。
解
要解决此问题,请使用realloc()
动态增加内存大小。 首先让我们看看上面的scanf()
缓冲区溢出是什么样子,只输入比您声明的内容更多的内容,然后看下面的结果。
下面的示例在C中使用动态内存分配(realloc)处理未知大小的用户输入。
#include
#include
int main()
{
unsigned int len_max = 128;
unsigned int current_size = 0;
char *pStr = malloc(len_max);
current_size = len_max;
printf("\nEnter a very very very long String value:");
if(pStr != NULL)
{
int c = EOF;
unsigned int i =0;
//accept user input until hit enter or end of file
while (( c = getchar() ) != '\n' && c != EOF)
{
pStr[i++]=(char)c;
//if i reached maximize size then realloc size
if(i == current_size)
{
current_size = i+len_max;
pStr = realloc(pStr, current_size);
}
}
pStr[i] = '\0';
printf("\nLong String value:%s \n\n",pStr);
//free it
free(pStr);
pStr = NULL;
}
return 0;
}
完成后,该程序可以轻松处理未知大小的用户输入。
标签: c
翻译自: https://mkyong.com/c/how-to-handle-unknow-size-user-input-in-c/