Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf读取的字符数超过目标变量所能容纳的字符数_C - Fatal编程技术网

scanf读取的字符数超过目标变量所能容纳的字符数

scanf读取的字符数超过目标变量所能容纳的字符数,c,C,以下代码从stdin读取最多10个字符并输出字符。 当我输入超过10个字符时,我希望它崩溃,因为msg没有足够的空间,但它没有!怎么可能呢 #include <stdlib.h> #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { char* msg = malloc(sizeof(char)*10); if (NULL==msg)

以下代码从
stdin
读取最多10个字符并输出字符。
当我输入超过10个字符时,我希望它崩溃,因为
msg
没有足够的空间,但它没有!怎么可能呢

 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>

 int main(int argc, char* argv[])
 {
     char* msg = malloc(sizeof(char)*10);
     if (NULL==msg)
         exit(EXIT_FAILURE);
     scanf("%s", msg);
     printf("You said: %s\n", msg);
     if (strlen(msg)<10)
         free(msg);
     return EXIT_SUCCESS;
 }
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*msg=malloc(sizeof(char)*10);
if(NULL==msg)
退出(退出失败);
scanf(“%s”,msg);
printf(“您说过:%s\n”,msg);
如果(strlen(msg)改用,
scanf
不是缓冲区安全的。您看到的是。

在使用scanf()时,您可以分配“安全”的大大小。在用户输入时,它应该是2行(cca.2x80字符),如果文件更大


结论:scanf()是一种快速而肮脏的东西,不要在严肃的项目中使用它。

您可以在
scanf()格式字符串中指定最大大小。

scanf("%9s", msg);

我可以想象
malloc()
分配与字边界对齐的内存块。在32位机器上,这意味着无论您请求什么,都将被四舍五入到最接近的4倍。这意味着您可能会得到至少11个字符的字符串(加上
'\0'
终止符),而不会遇到任何问题


但千万不要假设是这样。就像其他人所说的,如果你想避免问题,你应该在格式字符串中指定一个安全的最大长度。

它不会崩溃,因为c非常宽松,这与流行的观点相反。如果缓冲区溢出,程序不需要崩溃,甚至不需要抱怨。比如you定义

union{
 uint8_t a[3]
 uint32_t b
}
那么[4]是完美的记忆,没有理由崩溃(但千万不要这样做)。即使是[5]或[100]也可能是完美的。 另一方面,我可能尝试访问[-1],这恰好是操作系统不允许您访问的内存,从而导致SEGFULT


至于如何解决这个问题:正如其他人指出的,scanf与缓冲区一起使用是不安全的。请使用他们的建议。

当您有长度为10的字符数组时,尝试使用
scanf(“%9s”,msg)
进行扫描。(保留1个字符作为字符串终止字符
'\0'
)事实上,我输入了远远超过10个字符,我认为这超出了单词的界限,程序没有抱怨。它不会抱怨,只是会在某个时候崩溃。如果你在程序中定义了其他变量,你可能会发现它们的值做了奇怪的事情。你可能会发现这很有趣:问题是,为什么我们仍然可以ead的数据比我们分配的多!!