我在调试过程中遇到了这个错误(*s=*end;行(,同时尝试使用指针反转字符串。我使用的是Windows 10操作系统、代码块IDE和GDB调试器。
#include <stdio.h>
#include <string.h>
#include <limits.h>
void myreverse(char* s);
int main()
{
char* s1 = "1234";
myreverse(s1);
printf("%s", s1);
return 0;
}
void myreverse(char* s) {
char tmp;
char* end = s + strlen(s) - 1;
for(; s < end; s++, end--) {
tmp = *s;
*s = *end;
*end = tmp;
}
}
您应该将s1
更改为char s1[] = "1234";
,因为您正在对字符串进行更改。
然后在myreverse()
函数中,您永远不会使用tmp
变量,这会导致交换块失败。
固定:
#include <cstdio> // use the C++ versions of the header files
#include <cstring>
void myreverse(char* s) {
char tmp;
char* end = s + std::strlen(s) - 1;
for(; s < end; s++, end--) {
// swap
tmp = *s;
*s = *end;
*end = tmp; // use tmp
}
}
int main() {
char s1[] = "1234";
myreverse(s1);
printf("%s", s1);
}
注意,交换块中的3条线可以用std::swap(*s, *end);
替换,并且myreverse()
可以完全用std::reverse(std::begin(s1), std::end(s1));
替换。