【问题标题】:Strange printf output in CC中奇怪的printf输出
【发布时间】:2013-01-16 14:51:34
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * reverse(char *string);
int main(int argc, char *argv[])
{
    char array[10];
    array[0] = 'a';
    array[1] = 'b';
    array[2] = 'c';
    array[3] = 'd';
    array[4] = 'e';
    printf("1%s\n",array);
    char *p = reverse(array);
    printf("4%s\n",p);
    printf("5%s\n",array);
}

char * reverse(char *string)
{
    int size = strlen(string);
    char reversed[size];
    int i;
    int j = 0;
    for(i = size-1; i >= 0; i--)
    {
        reversed[j] = string[i];
        j++;
    }
    printf("2%s\n",reversed);
    string = reversed;
    printf("3%s\n",string);
    return reversed;
}

这段代码基本上只是初始化一个值数组并将其传递给一个反转这些值的方法。

我不确定这是否是执行任务的最佳方式,因为我不熟悉 C 中的指针和数组。

但真正的问题是:

谁能弄清楚这一行的原因

printf("4%s\n",p);

如果去掉前面的'4',就变成这样了

printf("%s\n",p);

该行根本不打印?

【问题讨论】:

    标签: c printf output


    【解决方案1】:

    您在函数reverse 中返回一个指向局部变量(reversed) 的指针,问题实际上应该是:Why did it work in the first place?

    这段代码string = reversed;只会复制指针,并且再次指针的本地复制所以它在函数之外没有任何影响。

    要反转字符串,您不需要额外的内存 - 这可以就地完成。

    【讨论】:

      【解决方案2】:

      C 中的字符串必须以空字符结尾。您在非空终止字符串上使用 strlen 。

      【讨论】:

        【解决方案3】:

        此外,你只是一个非常幸运的人,因为你的代码有一个严重的问题:你忘记在字符串末尾添加\0符号。

        UPD:主要问题在于代码行char reversed[size];。 它是一个常规的局部变量,它具有自动持续时间,这意味着它在函数被调用时出现,在函数返回(see this link) 时消失。

        您需要将其更改为:

        char *reversed = malloc((size+1)*sizeof(char));

        UPD-2:另一个错误修复将是:

        1) 在所有其他数组初始化行之后添加array[5] = '\0';

        2) 在for...loop 之后添加reversed[j] = '\0';

        for(i = size-1; i >= 0; i--)
        {
            reversed[j] = string[i];
            j++;
        }
        reversed[j] = '\0';
        

        UPD-3:但总的来说,它会以适当的方式更正确地初始化您的字符串:

        char array[10] = "abcde";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-03
          • 1970-01-01
          • 2022-01-12
          • 2021-09-23
          • 2021-12-03
          • 2011-06-14
          相关资源
          最近更新 更多