使用指针反转 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 字符串的主要内容,如果未能解决你的问题,请参考以下文章