代码:
#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
我确信我错过了一个基本概念,但我不确定解决此问题的方法。提前谢谢!
答案 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";