【问题标题】:Returning a string Backwards in C在C中向后返回一个字符串
【发布时间】:2018-05-09 11:35:59
【问题描述】:

在这段代码中,我想扫描一个单词并将其返回。我尝试使用不同的方法,但似乎没有成功。

这就是我现在剩下的。

#define WORD_LENGTH 256

char * stringBackwards(char *a) {

     char *palindrom = malloc(WORD_LENGTH * sizeof(char));
     int k = 0;
     for ( int i = WORD_LENGTH; i >= 0; i--, k++) {
          palindrom[k] = a[i];
     }

     return palindrom;
}

main() {
     char word[WORD_LENGTH];

     printf("Please enter a word \n");
     scanf_s("%s", word, WORD_LENGTH);

     printf("%s", stringBackwards(word));

     return 0;
}

它总是在我的控制台中返回一些奇怪的符号。

我希望你们中的一些人可以帮助我纠正这个问题。

【问题讨论】:

  • 您正在交换整个缓冲区,而不仅仅是字符串。所以你会在你的反向字符串的开头得到word 末尾的垃圾。
  • 我已经想到了。但即使我将 WORD_LENGTH 设置为 4 并输入 4 个随机字母,我也会得到垃圾。
  • 首先你需要记住char字符串实际上被称为null-terminated字符串。需要处理那个空终止符。然后考虑用户输入的情况,例如一个两个字符的字符串?剩下的 253 个字符将被初始化为什么?提示:他们不会。
  • 是的,因为字符串不是 nul 终止的:2 个问题
  • 或许您需要了解strlen 功能?或获取a good beginners book or two,它将解释这一切。想想当你在调用printf中使用你的函数时,谁会调用free来获取你malloc的内存?

标签: c string function return


【解决方案1】:

您正在交换整个缓冲区,而不仅仅是字符串。所以你会在你的反转字符串的开头得到word 末尾的垃圾。这里的下一个错误是没有终止你的字符串。

我会像这样修复它(并用增加的索引重写你的循环,否则很容易犯1-off错误):

char * stringBackwards(const char *a) {

 int sz = strlen(a);
 char *palindrom = malloc(sz+1);  // size + 1 for nul-termination char
 int k;
 for ( k = 0; k < sz; k++) {
      palindrom[k] = a[sz-k-1];
 }
 palindrom[k] = '\0'; // don't forget to nul-terminate
 return palindrom;

}

aside:存储返回的值,以便在需要时释放它。直接将其传递给printf 是内存泄漏。

【讨论】:

  • k 在 for 循环中是本地的,因此您将无法在循环后访问它。
  • 感谢您。在“经典”C 中,它甚至无效。固定
  • 感谢您修复它。我不知道 nul 终止的事情。也感谢你向我展示了 strlen 函数。
猜你喜欢
  • 2014-12-15
  • 2016-09-21
  • 2014-12-18
  • 2018-04-20
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
相关资源
最近更新 更多