我有一个用字符串做一些东西的函数,但它必须通过将它复制到一个char数组来保存原始字符串,使其全部为大写字母并用V替换任何w / W.
char* function(const char* text){
int textLength = strlen(text);
char text_copy[textLength];
for(int i = 0; i < textLength; i++){
if(text[i] == 'W' || text[i] == 'w')
text_copy[i] = 'V';
else
text_copy[i] = toupper(text[i]);
}
return 'a';
}
函数返回的内容并不重要,但每当我尝试使用某些字符串printf("%s\n", text_copy);
时,它都会返回:
belfast: BELFAST
please: PLEASE
aardvark: AARDVARK??
hello world: HELLO VORLD
taxxxiii: TAXXXIII???
swag: SVAG?
为什么有些字符串结果很好而有些却没有呢?感谢。
答案 0 :(得分:3)
您需要对副本进行空终止。
char text_copy[textLength+1];
...
text_copy[textLength]='\0';
虽然如果你从你的函数中返回它(不清楚),你应该改为使用它。
答案 1 :(得分:1)
纯粹的机会。为什么有些字符串结果很好而有些却没有?
您只为字符串中的可见字符分配enoufgh空间,而不是终止\0
。您很幸运,对于某些字符串,字符数组后面的堆栈中只有一个空字节。
更改您的代码......
int textLength = strlen(text);
char text_copy[textLength + 1]; // << enough space for the strings and \0
for(int i = 0; i < textLength; i++){
if(text[i] == 'W' || text[i] == 'w')
text_copy[i] = 'V';
else
text_copy[i] = toupper(text[i]);
}
text_copy[textLength] = '\0'; // Make sure it is terminated properly.