printf(“%s”)返回奇怪的值

时间:2017-03-28 09:16:34

标签: c

我有一个用字符串做一些东西的函数,但它必须通过将它复制到一个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?

为什么有些字符串结果很好而有些却没有呢?感谢。

2 个答案:

答案 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.