C字符无缘无故地加起来

我认为我发疯了,因为我找不到C为什么合并我的字符的解释。

我已经给你们做了一个测试程序...

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char alphabet_big[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char alphabet_small[26] = "abcdefghijklmnopqrstuvwxyz";

    printf("%s\n",alphabet_small);
    return 0;
}

结果:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZV

为什么C结合了Alphabet_small和Alphabet_big?那没有道理。为什么在字符末尾有一个“ V”?

我希望有人可以为我提供这个“问题”的答案。

最诚挚的问候。

wangxiqi198706 回答:C字符无缘无故地加起来

请记住, C String 被定义为以 null终止的 char数组。

在此处更改声明和初始化语句:(对于两个语句)

char alphabet_big[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//forces compiler to use only 26 char
                                                     //regardless of the count of initializers
                                                     //(leaving no room for NULL terminator)

收件人

char alphabet_big[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//allows compiler to set aside
                 ^^                                 //the proper space,no matter how many initializers

与任何字符串函数(例如strcpystrcmp,在这种情况下为printf)一起使用时,第一个产生 undefined behavior "%s"格式说明符。

第一个产生以下内容,它不是C字符串:

|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|?|?|?|     

第二个产生以下内容,它是一个C字符串:

|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|\0|?|?|   

注意-上图中使用的?符号表示该程序不拥有的存储器位置,其内容未知,甚至可能不存在。试图访问这些位置的程序将调用未定义的行为。

,

通常,库函数希望在字符串的末尾找到NUL字节,并且编译器很乐意为您自动添加

    例外,您已经告诉过alphabet_big只有26个字节,基本上避免了多余的NUL字节,因此它与下一个内容结合在一起。

    删除26,让编译器为您计数。

本文链接:https://www.f2er.com/3164007.html

大家都在问