C语言 为什么总是在这个字符串中添加2个额外的字符?

von4xj4u  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在用C语言编写一个程序,生成多个由随机字符组成的字符串,每个字符串的大小基本上是固定的,设置为8个字符,字符串的每个索引都输入一个随机字符,考虑到最后一个索引是空终止字符。
但是,每当我打印字符串时,就会得到2个额外的字符添加到字符串中,并且strlen()函数返回的长度为10,而不是8。
输出如下所示:

代码是这样的:

char password[9];
for(int cnt = 0; cnt < n; cnt++){
    for(int i = 0; i < 8; i++){
        if (i < 3){
            password[i] = rand() % 26 + 65;
        } else if (i < 6){
            password[i] = rand() % 26 + 97;
        } else if (i >= 6){
            password[i] = rand() % 10 + 48;
        }
    }
    printf("%s\n", password);
    printf("%d\n", strlen(password));

我试着做了一个随机字符串生成器,我希望字符串的大小和我设置的一样。

0qx6xfy6

0qx6xfy61#

char password[9];声明了一个数组,它提供了9个字符的数据,但是它没有将它们初始化为任何值(除非它是一个static或全局变量);它得到了它所占用内存中的垃圾,你填入了8个字符,第9个字符没有初始化,当作为一个C风格的字符串处理时,如果这些字符都不是NULL,你就把数组的末尾读到相邻的内存中,一直读下去,直到它碰巧碰到一个NULL(并决定它已经完成了),或者到达不可读的内存(并崩溃)。
要确保在将其视为C样式字符串之前正确以NUL结尾,请执行以下操作之一:

  • 更改声明以将字符初始化为零:

char password[9] = {0};

  • 或在某个点显式设置NUL终止符:

password[8] = '\0';

jfgube3f

jfgube3f2#

添加终止'\0'字符:

for(int i = 0; i < 8; i++){
        if (i < 3){
            password[i] = rand() % 26 + 65;
        } else if (i < 6){
            password[i] = rand() % 26 + 97;
        } else if (i >= 6){
            password[i] = rand() % 10 + 48;
        }
    }
    password[8] = '\0'; // <-- HERE

相关问题