我试图创建一个以安全的方式返回字符串的简单函数,我想知道这段代码有什么问题。
我决定使用read,因为scanf和fgets都有麻烦,
具体来说,如果i溢出缓冲区,则scanf给我中止陷阱6,即使明显检查长度,
当fgets接收输入时,如果我插入的字符串太长,则返回错误消息,但是然后在不允许我重新输入另一个字符串的情况下预先调整字符串。
这是代码:
beingTouched
现在有了读取它给了我一些相同的错误,我从标准输入读取了总共30个字节,
然后我在计数器的末尾添加空字符,但如果长度超过这个就是输出:
string get_string(const string prompt)
{
char temp[30];
int size,count;
printf("%s",prompt);
do
{
count=read(0,temp,29);
temp[count]='\0';
size=strlen(temp);
if(size>24)
{
printf("\x1B[31mError\x1B[0m: too long.\n%s",prompt);
}
printf("size :%i\n",size);
}
while(size>24);
stripc(temp,'\n'); //removes new line
string word=malloc((size)*sizeof(char));
strcpy(word,temp);
return word;
}
知道问题是什么吗? 还有另一种方法可以实现我的需要吗?
编辑:问题不会超出范围,
奇怪的是,一旦我写了超过24个字符,
应该读取输入的函数(read,scanf,fgets或者其他),
不再激活,这就是为什么尺寸:连续出现两次,
由于某种原因跳过输入插入,我想了解原因
我纠正了一些错误。
答案 0 :(得分:0)
如果在第一个输入中找不到换行符,则调用fgets直到找到换行符,以便清理输入流,然后继续外部while循环。
string get_string(const string prompt)
{
char temp[26] = "";//24 + newline + '\0'
int size,count;
while ( 1)
{
printf ( "%s",prompt);
if ( fgets ( temp, sizeof temp, stdin)) {
if ( !strchr ( temp, '\n')) {//no newline
printf("\x1B[31mError\x1B[0m: too long.\n%s",prompt);
size = strlen ( temp);
do {
fgets ( temp, sizeof temp, stdin);//read more and discard
size += strlen ( temp);
} while (!strchr ( temp, '\n'));//loop until newline found
printf("size :%i\n",size);
continue;//re prompt
}
break;
}
else {
fprintf ( stderr, "fgets problem\n");
return NULL;
}
}
temp[strcspn ( temp,"\n")] = '\0';//remove newline
string word = malloc(strlen ( temp) + 1);
strcpy ( word, temp);
return word;
}
答案 1 :(得分:-1)
这是一遍又一遍的错误......
C中的字符串空终止。这意味着保存字符串的内存必须大于字符串的长度。
您检查读取的字符串是否不超过24个字符,但是在malloc中,您不会为空字符添加空间。因此,strcpy
将空字符放在您的已分配内存之外。