C 如何为长度可变的字符串输入分配内存?

C 如何为长度可变的字符串输入分配内存?,c,gcc,C,Gcc,我知道在我的C代码的内存使用下面有一个简单的错误,因为简单for循环中的迭代器在收到命令行上的用户输入后会发生剧烈的变化: int i = 1; char input[] = ""; for (i = 1; i <= 5; i++) { printf("i %d\n> ", i); scanf("%s", input); printf("input %s\ni %d\n", input, i); } 我有一种预感,这来自于编译器中的内存访问。什么都行 看看

我知道在我的C代码的内存使用下面有一个简单的错误,因为简单for循环中的迭代器在收到命令行上的用户输入后会发生剧烈的变化:

int i = 1;
char input[] = "";
for (i = 1; i <= 5; i++) {
    printf("i  %d\n> ", i);
    scanf("%s", input);
    printf("input %s\ni %d\n", input, i);
}

我有一种预感,这来自于编译器中的内存访问。什么都行

看看局部变量是如何声明的:

input
是一个长度为零的字符串,没有为您要请求的输入分配空间。当您这样做时:

输入被写入
input
指向的数组中,但是由于没有为该数组保留空间,因此
input
引用的数组后面发生的任何事情都会被写入。在本例中,这就是
I


要解决这个问题,您需要确保在放置输入的位置有足够的空间。此外,您应该限制输入的允许长度,以便用户输入的数据不能超过您保留的空间大小。

看看本地变量是如何声明的:

input
是一个长度为零的字符串,没有为您要请求的输入分配空间。当您这样做时:

输入被写入
input
指向的数组中,但是由于没有为该数组保留空间,因此
input
引用的数组后面发生的任何事情都会被写入。在本例中,这就是
I

要解决这个问题,您需要确保在放置输入的位置有足够的空间。此外,您应该限制输入的允许长度,以便用户输入的数据不能超过您保留的空间大小。

scanf(“%s”,输入)

从scanf的文档中:

%s匹配不是空白字符的字节序列应用程序应确保相应的参数是指向字符、有符号字符或无符号字符数组的初始字节的指针,该数组的大小应足以接受序列和终止的空字符代码,并应自动添加

你是申请者<代码>字符输入[]=“”只有1字节大。
scanf返回的任何字符都会由于空终止符而导致输入溢出。并将写入内存中的下一个变量

尝试:

scanf(“%s”,输入)

从scanf的文档中:

%s匹配不是空白字符的字节序列应用程序应确保相应的参数是指向字符、有符号字符或无符号字符数组的初始字节的指针,该数组的大小应足以接受序列和终止的空字符代码,并应自动添加

你是申请者<代码>字符输入[]=“”只有1字节大。
scanf返回的任何字符都会由于空终止符而导致输入溢出。并将写入内存中的下一个变量

尝试:


回想一下,每个C字符串都必须为nul终止字符
'\0'
(ASCII
0
)提供空间,该字符除了要存储的每个字符外,还需要在字符串末尾添加一个字符。(这就是函数知道字符串结尾的方式…
charinput[]=”
声明并将1-char数组初始化为空字符串(仅为
'\0'
字符)。一旦声明,数组大小是固定的,因此它永远不能存储字符串(空字符串除外),最多只能存储1个字符(字节)。此外,除非检查返回值,否则无法正确使用任何输入函数。对的基本解释可能会有所帮助。回想一下,每个C字符串都必须为nul终止字符
'\0'
(ASCII
0
)提供空间,该字符除了要存储的每个字符外,还需要在字符串末尾添加一个字符。(这就是函数知道字符串结尾的方式…
charinput[]=”
声明并将1-char数组初始化为空字符串(仅为
'\0'
字符)。一旦声明,数组大小是固定的,因此它永远不能存储字符串(空字符串除外),最多只能存储1个字符(字节)。此外,除非检查返回值,否则无法正确使用任何输入函数。一个基本的解释可能会有所帮助。
i 1
> <receive input>
input <input>
i 1
i  1
> 45
input 45
i 53
int i = 1;
char input[] = "";
scanf("%s", input);
char input[100] = "";
scanf("%100s", input);