反转字符串的另一种标准方法是使用指针从字符串的开头和结尾开始工作,每次迭代交换两个字符。其交换代替原始的字符串(复印一份,如果你需要保留原始,或通过第二串并放置颠倒字符串中有)
/** strrevstr - reverse string, swaps 2 chars per-iteration.
* Takes valid string and reverses, original is not preserved.
* If 's' is valid and non-empty, returns pointer to 's',
* returns NULL otherwise.
*/
char *strrevstr (char *s)
{
if (!s || !*s) { /* validate string is not NULL and non-empty */
printf ("strrevstr() error: invalid string\n");
return NULL;
}
char *begin = s; /* pointers to beginning and end, and tmp char */
char *end = begin + strlen (s) - 1;
char tmp;
while (end > begin) /* swap both beginning and end each iteration */
{
tmp = *end;
*end-- = *begin;
*begin++ = tmp;
}
return s;
}
正如你所知道的,有多种方式要解决这个问题,通过提供这些和其他答案,您应该能够调整解决方案以满足您的需求。
每种方法都有优点和缺点。动态分配一个新的内存块来保存反向字符串没有什么问题,它只是增加了一个额外的责任:(1)保留一个指向新块的起始地址的指针,这样(2)当它不再被释放时需要。如果您需要保留原始字符串,则将指针传递给足够大小的字符数组以保存反转字符串是保留原始字符串的另一个选项。
查看所有答案,并让我知道如果您有任何问题。
请更具体地说明什么是不工作。它是否存在分割?未能编译?给出不正确的结果? – merlin2011
请写出具有一致风格且可读性强的代码。而且,main()的成功值是'0'。或者更准确地说,是'EXIT_SUCCESS'。最后,如果你扭转了字符串,你应该想!你需要交换多少个字符?然后你会明白为什么它不起作用。 –
您正在返回本地数组的地址,但数组已分配到堆栈上,并且在函数返回时不再可用。你需要做以下三件事之一:(1)通过调用'malloc',让'inverse'在堆上分配数组,(2)让调用者传递一个指向所需结果数组的指针,或者(3) '在原地颠倒参数字符串。 –