0

我为Brian Kernighan的“ C 编程语言练习 1-19编写了一个简单的解决方案,它可以反转字符串。reverse(char[])功能如下,一切正常;

void reverse(char src[])
{   
    int len = 0;
    while( src[len] != '\0')
        len++;

    for(int i = 0; i < len/2; i++)
    {
        char temp = src[i];
        src[i] = src[len - 1 - i];
        src[len - 1 - i] = temp;
    }
}

但是,如果我在 while 循环中使用后缀增量 (++) 运算符,则函数将失败;

void reverse(char src[])
{   
    int len = 0;
    while( src[len++] != '\0')      // this fails
        ;

    for(int i = 0; i < len/2; i++)
    {
        char temp = src[i];
        src[i] = src[len - 1 - i];
        src[len - 1 - i] = temp;
    }
}

唯一的区别是,我没有在 while 循环中增加变量len,而是使用了后缀 ++ 运算符,其行为预期应该是“使用旧值进行条件检查,完成后增加它”。

为什么它没有按预期工作,我在哪里做错了?我在 Windows 10 Mingw/gcc 编译器下编译它。这是整个测试代码;

测试代码

#include <stdio.h>

#define STR_NUM     5
#define STR_SIZE    20

void reverse(char[]);   // declaration

int main()
{   
    char str[STR_NUM][STR_SIZE] =
    {
        { "A"     },
        { "AB"    },
        { "ABC"   },
        { "ABCD"  },
        { "ABCDE" }
    };

    for(int i = 0; i < STR_NUM; i++)
        reverse(str[i]);

    for(int i = 0; i < STR_NUM; i++)
        printf("%s\n", str[i]);

    return 0;
}

// this is working
void reverse(char src[])
{   
    int len = 0;
    while( src[len] != '\0')
        len++;

    for(int i = 0; i < len/2; i++)
    {
        char temp = src[i];
        src[i] = src[len - 1 - i];
        src[len - 1 - i] = temp;
    }
}

// this is failing
/*
void reverse(char src[])
{   
    int len = 0;
    while( src[len++] != '\0')      // this fails
        ;

    for(int i = 0; i < len/2; i++)
    {
        char temp = src[i];
        src[i] = src[len - 1 - i];
        src[len - 1 - i] = temp;
    }
}
*/
4

1 回答 1

5

后缀增量运算符返回原始值并加一。

while( src[len] != '\0')
    len++;

在工作版本中,当src[len]是 a时,while 循环将终止\0。当 while 循环测试条件失败时,循环内的语句不会执行。循环后len包含一个值,使得src[len] == '\0'.

while (src[len++] != '\0');

在您的修改版本中,当执行最终测试时,len将再增加一次。循环后len包含一个值,该值src[len]超过数组末尾。

然而,for循环假定这len是字符串长度,所以你有一个错误的错误。

于 2016-04-14T20:44:00.890 回答