为什么我的输出会根据变量len的定义方式而有所不同?

时间:2017-03-20 21:01:49

标签: c

代码:

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

int main() {
    int len = 3; // length of word
    char * word = "cat"; // word to be sorted
    char sortedWord[len];
    int i, j, temp;
    // store chars from 'word' to an array 'sortedWord[]'
    for (i = 0; i < len; i++) {
        sortedWord[i] = *word;
        word++;
    }

    // sort the array using bubble sort
    for (i = 0; i < len - 1; i++) {
        for (j = 0; j < len - i - 1; j++) {
            if (sortedWord[j] > sortedWord[j + 1]) {
                temp = sortedWord[j];
                sortedWord[j] = sortedWord[j + 1];
                sortedWord[j + 1] = temp;
            }
        }
    }
    printf("%s\n", sortedWord);

}

这个问题的焦点是变量'len'。如果我将len定义为等于3,那么输出就像预期的那样(即“act”)。但是,我希望能够在不明确定义长度的情况下找到长度。

我试图将len定义为:

int len = strlen (word);

但是,输出不符合预期。它会给我一些结果,例如actW?,actX?等等。

当我尝试将len定义为:

时,会出现同样的行为
int len;
for (len = 0; *word != '\0'; len++) {
    word++;
}

令人惊讶的是,如果我在明确定义后立即打印变量len,它的行为方式也会相同。

int len = 3;
printf("Length: %d\n", len); // will cause the output to be different

我确信我错过了一个基本概念,但我不确定解决此问题的方法。提前谢谢!

1 个答案:

答案 0 :(得分:1)

storeWord null未终止导致未定义的行为,添加null终结符,它将不再有不正常的行为。

而且,如果你增加word指针,它最终会指向原始字符串的null终止符,所以不要这样做。而是使用索引来访问元素。

char sortedWord[len + 1]; // One more for the '\0'
int i, j, temp;
// store chars from 'word' to an array 'sortedWord[]'
for (i = 0; i < len; i++) {
    sortedWord[i] = word[i];
}
storeWord[len] = '\0';

还有一件事,在编写指向字符串文字的指针时,使用const来防止意外地修改它们,因为这也是未定义的行为,所以

const char *word = "cat";