如果创建交换功能时未使用“ temp”变量,那么这段代码会反转字符串怎么了?

时间:2018-08-21 15:00:56

标签: c string

/*implementation of strrev i.e. string reverse function*/

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

/*length of the string i.e. cells in the string*/
static const unsigned int MAX_LENGTH = 100;
//static const int MAX_LENGTH = -100;

/*reverses the string*/
void reverseString(char[]);
/*swaps the elements in the cells of a string*/
void swap(char[], int, int);

/*runs the program*/
int main()
{
    char string[MAX_LENGTH];
    //char string[0];  //no error!
    //char string[-1]; //error! 

    gets(string);
    reverseString(string);
    printf("\n%s", string);

    return 0;
}

void reverseString(char string[])
{
    int i;
    for(i = 0; i < (strlen(string) / 2); i++)
    //for(i = 0; i <= ((strlen(string) - 1) / 2); i++)
    {
        swap(string, i, (strlen(string) - 1 - i));
    }
}

void swap(char string[], int i, int j)
{
    int temp = string[i];
    string[i] = string[j];
    string[j] = temp;
    /*     
    string[i] = string[i] + string[j];  //i = i + j
    string[j] = string[i] - string[j];  //j = i + j - j = i
    string[i] = string[i] - string[j];  //i = i + j - i = j
    */
}

查看“ reverseString”和“交换”功能。当前代码可以完美运行。如果不使用“ temp”变量来重写交换功能,则代码仍然可以平稳运行。

但是,如果将“ reverseString”函数中的“ for”行替换为其正下方的代码(使用单行注释进行注释),则如果修改了交换功能(无温度),则该代码不适用于单个字符串使用,但是如果使用原始的交换函数(带有temp),则可以使用。

为什么会出现这种行为?

3 个答案:

答案 0 :(得分:3)

不具有临时功能的交换功能的版本取决于两个索引彼此不同。

假设ij相同。然后,您将有效地具有以下条件:

string[i] = string[i] + string[i];  // string[i] is now 2 * string[i]
string[i] = string[i] - string[i];  // string[i] is now always 0
string[i] = string[i] - string[i];  // still 0

因此,将元素与自身交换会将其归零。

现在,当您使用reverseString作为条件时,请查看i < (strlen(string) / 2)中的循环。如果字符串的长度为奇数,则循环在到达中间元素之前停止,因此不会发生与自身交换元素的情况。

但是当您使用i <= ((strlen(string) - 1) / 2)时,循环确实在中间元素上运行,该中间元素随后与自身交换并被清零。

答案 1 :(得分:1)

我建议减少Selected个电话。您的代码IMO太复杂了

strlen

char *reverse(char *str) 
{
    char *saved = str;
    size_t len = strlen(str);
    char *end = str + len - 1; 

    for(size_t index = 0; index < len / 2; index++)
    {
        char tmp = *str;
        *str++ = *end;
        *end -- = tmp;
    }
    return saved; 
}

为什么要返回char *reverse1(char *str) { char *saved = str; size_t len = strlen(str); char *end = str + len - 1; while(str < end) { char tmp = *str; *str++ = *end; *end -- = tmp; } return saved; } 而不是char *。它允许您直接在其他操作中使用这些功能。例如:

void

答案 2 :(得分:0)

它不起作用,因为您不能使用此代码:

string[i] = string[i] + string[j];  //i = i + j
string[j] = string[i] - string[j];  //j = i + j - j = i
string[i] = string[i] - string[j];  //i = i + j - i = j

交换变量的值本身,因为它是同一个变量,而不是两个不同的变量,并且值被覆盖。

我强烈建议您开始使用C ++,并在每次需要交换内容时使用std::swap() =)