【问题标题】:Writing to char array, empty output写入 char 数组,空输出
【发布时间】:2026-01-20 13:25:01
【问题描述】:

我想知道这里发生了什么,我在 reverse 函数之外为 dest 变量分配空间。然后在函数调用中写入它。但是我的输出是空白的。我想在没有 malloc 的情况下这样做,纯粹是出于教育目的。谢谢

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

/*function declaration*/
void reverse(char *src, char *dest);

int main(void) {

char src[] = "hello, world";
char dest[strlen(src)];
reverse(src, dest);
printf("%s\n", dest);

return 0;
}

/*function reverse a string*/
void reverse(char *src, char *dest) {
int i;
int j = 0;
for(i = strlen(src); i >= 0; i--) {
  *(dest+j) = *(src+i);
  ++j;
  }
}

【问题讨论】:

  • 你知道你可以dest[j] = src[i] 吗?

标签: c arrays string pointers reverse


【解决方案1】:

1) 因为你的迭代开始于

for(i = strlen(src); i >= 0; i--) {

它将0 分配给dest,从而终止字符串。所以 printf() 在看到 0 终止符时什么也不打印。您可以将其重写为:

for(i = strlen(src) - 1; i >= 0; i--) {
  *(dest+j) = *(src+i);
  ++j;
  }
 dest[j] = 0; /* terminates the string */

2) 你还有另一个问题。您的 dest 空间不足。应该是:

char dest[strlen(src) + 1]; /* Notice the +1 */

3) 对于数组索引,您应该使用size_t 而不是int

【讨论】:

  • 谢谢,为什么 size_t 是数组索引的首选?
  • int 可能无法保存所有可能的数组索引;而size_t 可以。
  • strlen() 返回size_t。现在,您可能会收到有关从 size_tint 的隐式转换的警告(至少在您提高警告级别的情况下)。
  • 如果size_t 恰好是int,则可能不会出现警告。无论警告如何,始终使用正确的类型,例如size_t 用于字符串函数,如果它们返回 size_t(大多数都这样做)。
  • 我没有收到警告,当我将 i 和 j 都更改为具有类型时,size_t 出现分段错误...
【解决方案2】:

您忘记了字符串中的空字符。 dest 不够大,无法容纳字符串的反转,因为需要有一个空终止符:

 char dest[ strlen(src) + 1 ];

然后在循环中将空终止符复制到字符串的前面,因此它本质上是字符串"",但使用更多内存。你需要从索引strlen() - 1开始:

for(i = strlen(src)-1; i >= 0; i-- ){

【讨论】:

    【解决方案3】:

    问题在于reverse() 中的for(i=strlen(src).....src[strlen(src)]0(零;字符串终止)。因此,当您到达printf() 时,它会看到第一个字符并输出一个空字符串。

    使用strlen(str)-1,然后使用*(dest+j) = 0 for 循环之后。

    总的来说,reverse() 应该是:

    void reverse(char *src, char *dest) {
        int i;
        int j = 0;
        for(i = strlen(src)-1; i >= 0; i--) {
            *(dest+j) = *(src+i);
            ++j;
        }
        *(dest+j) = 0;
    }
    

    【讨论】:

      最近更新 更多