如何在C中处理未知大小的用户输入

这是处理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;
}

   
   
  
  

完成后,该程序可以轻松处理未知大小的用户输入。

翻译自: https://mkyong.com/c/how-to-handle-unknow-size-user-input-in-c/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值