使用指针反转char字符串

时间:2015-04-23 07:05:59

标签: c++ arrays string pointers

我只需要用指针反转我的char字符串。我怎样才能做到这一点?我的代码:

    // this cannot be modified !!!
char s[10] = "abcde";
char *pS;

// my code
pS = new char;

int count = 5;

for (int i = 0; i < 10; i++)
{
    if (s[i] != '\0') // not null
    {

        pS[count - 1] = s[i];
        count--;
    }
}

cout << "Reversed = " << pS;

有时如果工作正常,我只看到5个字符,它们是相反的。但有时我会看到一些额外的字符(看起来像临时符号)。我想念什么?谢谢!

3 个答案:

答案 0 :(得分:2)

你的char数组“s”包含10个字符,但你只用“abcde”和\ 0终结符初始化该数组的前6个字符。 当您遍历整个数组时,您将访问未初始化的字符。

我也看到,你试图写入你没有分配的内存。 您只为“pS”指针为1个字符分配内存,但是您尝试访问它的内存,就像它是for循环中的字符数组一样。

而不是使用硬编码:

int count = 5;

你也可以使用字符串函数strlen()来确定c字符串的长度。

已编辑(未经测试的代码):

char s[10] = "abcde";
char pS[10];

for (int i = 0; i < strlen(s); i++)
{
    if (s[i] == '\0') // not null
    {
        // stop loop, as soon as you reach the end of the original string
        break;
    }
    pS[strlen(s) - 1 - i];
}

// now add the termination char \0 to your pS array
pS[strlen(s)] = '\0';

cout << "Reversed = " << pS;

答案 1 :(得分:1)

只是给你提示如何使用指针反转字符串:

  1. 前后两个指针,前面指向第一个字符串字符串,后面指向字符串的最后一个字符。
  2. 检查前方是否小于后方
  3. 如果是,请交换第一个和最后一个字符的值。如果不是,只需打印字符串。
  4. 增加前指针并减少后指针
  5. 从第2步开始重复。

答案 2 :(得分:0)

阅读完另一本书之后,我完全理解指针以及如何正确分配内存。这是我的最终代码,它正确地反转了char字符串的数组(我不需要通用代码,只是工作示例+没有用于反转的std方法):

// not edited part - based on exercise (I mean I cannot change pS to char[5] etc.
char s[10] = "abcde";
char *pS;

pS = new char[strlen(s) + 1]; // allocate correct memory size based on string size

cout << "Size is " << sizeof(pS) << endl; // just for testing
int count = strlen(s); // for iteration

pS[count] = '\0'; // last symbol must be '\o' (thanks to Mr.Yellow)

for (int i = 0; i < 10; i++) // 10 because array of char still has 10 elements
{
    if (s[i] != '\0') // looks like "not garbage memory"
    {
        count--;
        pS[count] = s[i]; // set correct value
    }
}

cout << "Reversed = " << pS << endl;

感谢所有帮助我的人!