使用指针表示法反转cstring时出现意外结果

Unexpected result when reversing cstring with pointer notation

本文关键字:意外 结果 cstring 指针 表示      更新时间:2023-10-16

我将两个c-string(一个包含字符,另一个为空)传递给一个函数,该函数应该接受包含字符的c-string,并使用从后面读取的字符串填充空c-string。操作简单,但行不通。我就是不知道我做错了什么。

#include <iostream>
#include <cstring>
using namespace std;
void magic(char*, const char*, int);
int main()
{
   char string1[20];
   char string2[] = "This is a test";
   char *str1 = string1; 
   char *str2 = string2;
   int stringsize = strlen(string2);
   magic(str1, str2, stringsize);
   return 0;
}
void magic(char* string1, const char* string2, int stringsize)
{
   cout << string2 << endl; //here it prints as expected
   *(string1 + stringsize) = '';
   string1 = string1 + stringsize - 1;
   for(;*string2 != '' ;string1--, string2++)
   {
      *string1 = *string2;
   }
   cout << string1 << endl; //blank space is printed - expected "This is a test" reversed
   cout << string2 << endl; //blank space is printed - expected "This is a test" 
}

如果您使用一个非常简单的字符串遵循for循环中的步骤,您可以看到逻辑中的问题。比方说,

string1 = "This";

在循环的第一次迭代中,

string1 = "This";
string2 = "T";

在循环的第二次迭代中,

string1 = "his";
string2 = "hT";

在第三次循环中,

string1 = "is";
string2 = "ihT";

在循环的第四次迭代中,

string1 = "s";
string2 = "sihT";

在循环的第五次迭代中,

string1 = "";
string2 = "?sihT";  // You go past the start of the array.

因此,在for循环结束后,您需要增加string2以确保它指向数组的开始。

void magic(char* string1, const char* string2, int stringsize)
{
   cout << string2 << endl;
   *(string1 + stringsize) = '';
   string1 = string1 + stringsize-1;
   for(;*string2 != '' ;string1--, string2++)
   {
      *string1 = *string2;
   }
   // Add this.
   string1++;
   cout << string1 << endl; // This is now the reversed string.
   cout << string2 << endl; // This is now the empty string since
                            // you kept incrementing it in the for
                            // loop until you reached the end of the
                            // string.
}