使用指针反转 char 字符串

Posted

技术标签:

【中文标题】使用指针反转 char 字符串【英文标题】:Reverse char string with pointers 【发布时间】: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 如何仍然存储反向字符串并分配一个字符?” 访问未分配的内存只是未定义的行为,可能会或可能不会“工作”。 【参考方案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】:

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

    在前面和后面取两个指针,前面指向字符串的第一个字符,后面指向字符串的最后一个字符。 检查前是否小于后 如果是,交换第一个和最后一个字符的值。如果没有,就打印字符串。 前指针递增,后指针递减 从第 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;

感谢所有帮助我的人!

【讨论】:

以上是关于使用指针反转 char 字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用指针在 C++ 中反转字符串

指针字符串反转

C语言九十六之实现经典的字符串反转(通过指针或下标操作)

Leetcode344. 反转字符串(JAVA双指针)

Leetcode刷题100天—344. 反转字符串(双指针)—day20

Leetcode刷题100天—344. 反转字符串(双指针)—day20