是否在C中为用户输入字符串指定数组大小?

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

我正在编写代码以将来自终端的用户输入作为字符串。我已经在线阅读了在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],前提是当用户输入一个字符串时,它会升至该索引。

我的问题是:

  1. 从scanf取值后,“ str”数组的大小是否增加?
  2. 我的原始数组将溢出多少字符串字符?
c arrays string scanf
1个回答
0
投票

当您完成声明的char数组时:

char str[10] = "Jessica";

然后您告诉编译器该数组最多可容纳10类型的char值(通常-甚至总是-这是8位字符)。然后,当您尝试使用超出分配的大小的索引访问该数组的“成员”时,将得到称为Undefined Behaviour的信息,这意味着绝对可能发生任何事情:程序可能会崩溃;您可能会获得看起来像“明智”的价值;您可能会发现硬盘已完全擦除!该行为是不确定的。因此,请确保遵守声明中设置的限制:对于您的情况下的str[n],如果n < 0n > 9(数组索引从零开始),则该行为未定义。您的代码:

printf("%c\n", str[15]);

正是我所描述的-它超出了str数组的“界限”,因此将导致所描述的未定义行为(UB)。

[此外,如果用户输入的字符串长度大于9(必须为终止的scanf("%s", &str);字符保留一个字符),您的nul也可能会导致这种UB!您可以通过告诉scanf函数接受最大字符数来防止这种情况:

scanf("%9s", &str);

[%之后给出的整数是允许的最大输入长度(此后的任何内容都将被忽略)。>>

希望这会有所帮助!随时要求进一步的澄清和/或解释。

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