【问题标题】:Reverse char string with pointers使用指针反转 char 字符串
【发布时间】:2015-04-23 07:05:58
【问题描述】:

我只需要使用指针来反转我的 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 个字符,它们被颠倒了。但有时我会看到一些额外的字符(看起来像临时符号)。我在哪里错过了什么?谢谢!

【问题讨论】:

  • 您不应使用硬编码数字。使用 strlen 查找长度。
  • pS = new char;single char 分配空间,而不是数组。
  • 您是应该创建一个新字符串还是原地反转原字符串?目前尚不清楚“无法修改”是什么意思。
  • 致 molbdnilo:我需要在 pS 变量中存储反向字符串致 CreativeMind:这只是测试代码,我想完全理解指针:) 致 πάντα ῥεῖ:是的,我明白了。但是我的 pS 如何仍然存储一个分配一个字符的反转字符串?
  • @VladyslaveSemenchenko “但是我的 pS 如何仍然存储反向字符串并分配一个字符?” 访问未分配的内存只是未定义的行为,可能会或可能不会“工作”。

标签: c++ arrays string pointers


【解决方案1】:

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

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

而不是使用硬编码:

int count = 5;

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

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

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;

【讨论】:

  • 感谢您的不宣誓。如何为 5 个字符分配内存?
  • @VladyslaveSemenchenko "我怎样才能为 5 个字符分配内存?" 像这样pS = new char[5]; 不要忘记打电话给delete [] pS;,如果它不再使用.
  • 致 πάντα ῥεῖ:嗯..仍然看到额外的符号。所以我的 Ts 字符串看起来像 edcba 然后是一些临时符号。看起来我分配内存错误:(
  • 您可能只是忘记了新“数组”的终止字符。所以“cout
【解决方案2】:

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

  1. 在前面和后面取两个指针,前面指向字符串的第一个字符,后面指向字符串的最后一个字符。
  2. 检查前是否小于后
  3. 如果是,交换第一个和最后一个字符的值。如果没有,就打印字符串。
  4. 前指针递增,后指针递减
  5. 从第 2 步开始重复。

【讨论】:

    【解决方案3】:

    读完另一本书后,我完全理解了指针以及如何正确分配内存。这是我的最终代码,它正确地反转了 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;
    

    感谢所有帮助我的人!

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多