/*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),则可以使用。
为什么会出现这种行为?
答案 0 :(得分:3)
不具有临时功能的交换功能的版本取决于两个索引彼此不同。
假设i
和j
相同。然后,您将有效地具有以下条件:
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()
=)