在 C 中打印字符串的正确大小的问题

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

在下面的代码中:

#include <stdio.h>

int main(){
    char word[]="";
    scanf("%s",word);

    printf("%s: %d\n", word, sizeof(word));
}
Input: 
Hello

Output: 
Hello: 1

为什么

sizeof(word)
打印
word
的原始大小,尽管在执行
scanf()
函数后包含“Hello”而不是空字符串。

我希望输出是

Hello: 6

我知道这个问题与我初始化
word
数组的方式有关,但正如你所看到的,我想避免将静态大小设置为
word
以及任何与字符串相关的
header file

我正在使用 VS Code 和 gcc(Rev2,由 MSYS2 项目构建)13.2.0 编译器

arrays c char undefined-behavior
1个回答
0
投票

当您使用

scanf
时,C 不会动态更改数组的大小。

char word[]="";
声明一个足够大的数组,可以包含字符串文字
'""
指示的数组。

""
表示以空字节结尾的零个字符的字符串。该字符串仅由一个字节(空字节)表示。所以它的数组包含一个元素。

scanf("%s",word);
要求
scanf
从标准输入流中读取字符串并将其写入数组
word
。如果输入中有任何非空白字符,这将尝试写入超出单字节数组末尾的位置
word
。那么该行为不是由 C 标准定义的。

如果程序继续,则

sizeof(word)
是定义的数组大小,一个字节。
scanf
扫描的不是字符串的长度。

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