为什么scanf(“%s”)在char *上表现不正常?

问题描述 投票:1回答:2

我正在尝试解决this problem

当我创建一个char *并将其传递给scanf时:

char* input = "";
scanf("%s", input);

其行为为weirdly。但是,当我更改定义并将1000个字符初始化为\0时:

char input[1000] = { '\0' };

其行为正常。为什么会这样?

c string scanf
2个回答
3
投票

我猜您正在看到细分错误。声明char* input = "";时,将导致input是指向字符串文字的指针。字符串文字存储在内存的只读部分中。因此,尝试用scanf覆盖数据是对内存的无效使用。

但是,当您声明char input[1000];时,您现在在堆栈上有了一个数组,这是可以写入的内存部分。这就是该代码起作用的原因。


0
投票

第一个问题是什么呢?

char* input = "";

这是一个字节。如果您还需要编写其他内容,则为undefined behaviour,或更通俗地说是weird behaviour

正确重新编写它后,您将获得一个1000个字符的缓冲区,并且can可以读取它而没有未定义的行为,只要输入的内容为<1000个字符。

© www.soinside.com 2019 - 2024. All rights reserved.