我正在编写代码以将来自终端的用户输入作为字符串。我已经在线阅读了在C中实例化字符串的正确方法是使用字符数组。我的问题是,如果我实例化一个大小为[10]的数组,那是10个索引吗? 10位? 10个字节?参见下面的代码:
#include <stdio.h>
int main(int argc, char **argv){
char str[10] = "Jessica";
scanf("%s", &str);
printf("%c\n", str[15]);
}
在此示例中,“ str”被初始化为大小10,并且我能够打印出str [15],前提是当用户输入一个字符串时,它会升至该索引。
我的问题是:
当您完成声明的char
数组时:
char str[10] = "Jessica";
然后您告诉编译器该数组最多可容纳10
类型的char
值(通常-甚至总是-这是8位字符)。然后,当您尝试使用超出分配的大小的索引访问该数组的“成员”时,将得到称为Undefined Behaviour的信息,这意味着绝对可能发生任何事情:程序可能会崩溃;您可能会获得看起来像“明智”的价值;您可能会发现硬盘已完全擦除!该行为是不确定的。因此,请确保遵守声明中设置的限制:对于您的情况下的str[n]
,如果n < 0
或n > 9
(数组索引从零开始),则该行为未定义。您的代码:
printf("%c\n", str[15]);
正是我所描述的-它超出了str
数组的“界限”,因此将导致所描述的未定义行为(UB)。
[此外,如果用户输入的字符串长度大于9(必须为终止的scanf("%s", &str);
字符保留一个字符),您的nul
也可能会导致这种UB!您可以通过告诉scanf
函数接受最大字符数来防止这种情况:
scanf("%9s", &str);
[%
之后给出的整数是允许的最大输入长度(此后的任何内容都将被忽略)。>>
希望这会有所帮助!随时要求进一步的澄清和/或解释。