C中的字符串行为

Jor*_*ril 5 c arrays string

我正在读C课程(这是荷兰语,所以可能你不会知道)并且有一个小练习来理解字符串行为.因此我创建了一个小的C程序来开始练习,但我的程序的第一个输出(对我来说)已经令人惊讶.

我的C程序的来源:

#include <string.h>
#include <stdio.h>

void printString(char *string)
{
    printf("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n");
    printf("%c ",string[0]);
    printf("%c ",string[1]);
    printf("%c ",string[2]);
    printf("%c ",string[3]);
    printf("%c ",string[4]);
    printf("%c ",string[5]);
    printf("%c ",string[6]);
    printf("%c ",string[7]);
    printf("%c ",string[8]);
    printf("%c ",string[9]);
    printf("%c  ",string[10]);
    printf("%c  ",string[11]);
    printf("%c  ",string[12]);
    printf("%c  ",string[13]);
    printf("%c  ",string[14]);
    printf("%c  ",string[15]);
    printf("%c  ",string[16]);
    printf("%d  ",string[17]);
    printf("%d  ",string[18]);
    printf("%d\n",string[19]);
}

void main(){

    char str[20];

    strcpy(str,"Dag grootmoeder!");
    printString(str);
}
Run Code Online (Sandbox Code Playgroud)

我用gcc编译(没有特殊的开关)并且多次运行程序:(对于会说英语的人Dag grootmoeder! == Hi grandma!)

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    94  -90  111

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    51  -12  96

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    -17  -117  28

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    96  15  -28

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    -20  -46  -18

$./oefString 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

D a g   g r o o t m o  e  d  e  r  !    68  -75  58
Run Code Online (Sandbox Code Playgroud)

这是一个问题:

1)为什么我得到str的最后3个索引的垃圾值?起初我也printf()正在使用它们%c并注意到字符发生了变化,这就是我%d之后使用它来显示整数值的原因.

2)为什么这些值会发生变化?我什么也没做,然后使用strcpy()str 复制相同的字符串.

感谢您花时间阅读,甚至更多的回复者!

乔恩

cni*_*tar 8

你只是在字符串结尾处访问内存.你没有填写它,所以你可以在那里找到任何东西 - 所以这就是为什么在每次运行中你都能找到别的东西.

在C中,"字符串"实际上是0终止的数组(或指向内存的指针).所以,如果你使用打印的字符"%d",你会发现非常最后一个元素,之后!0.

如果您希望它是可预测的,您可以在使用之前初始化字符串:

memset(str, 0, sizeof(str));
Run Code Online (Sandbox Code Playgroud)

要么

char str[20] = {0,};
Run Code Online (Sandbox Code Playgroud)

作为旁注,它int main不是void main.