【发布时间】:2014-09-07 19:49:03
【问题描述】:
我知道我可以使用gets(char *) 从用户那里获取包含空格的字符串输入,但我读到了缓冲区溢出问题。使用strcpy、strcmp(和其他一些函数)是不安全的,我们应该使用strncpy、strncmp 并明确提及输入的大小。 Stack Overflow 上的某个人告诉我。所以,我担心使用gets 从用户那里获取输入还是安全的?如果安全,请告诉我,我会继续使用它。如果不是,那么从用户那里安全地获取间隔字符串输入的另一种方法是什么?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a[2];
char b[] = "first";
char c[] = "second";
int s1; //,s2;
// printf("\nLong you want your %s string to be: \n",b);
//scanf("%d",&s1); fflush(stdin);
//printf("\nLong you want your %s string to be: \n",c);
// scanf("%d",&s1); fflush(stdin);
int i;
for(i=0; i<2; i++) {
printf("\nLong you want your %s string to be: \n",b);
scanf("%d",&s1); fflush(stdin);
a[i] = (char *) malloc(s1*sizeof(char));
}
printf("\nEnter the first string: \n");
scanf("%s", a[0]); fflush(stdin);
printf("\nEnter the second string: \n");
scanf("%s", a[1]); fflush(stdin);
printf("\nThe first string is: %s\n", a[0]);
printf("\nThe second string is: %s\n", a[1]);
}
【问题讨论】:
-
这个问题似乎离题了,因为它表明缺乏研究。
-
请注意,滥用
strncpy()和(尤其是)strncat()与滥用strcpy()和strcat()一样容易。使用strncmp()与strcmp()通常是所需逻辑而非安全性的问题——它们是只读操作。如果您不知道您的数据是否在以空字符结尾的字符串中,那么没有什么是安全的。最终,如果您不知道要复制的字符串的长度,它们也不安全。使用gets()从来都不是安全的;它不再是标准 C 的一部分,永远不应使用。
标签: c