我正在尝试编写一个函数来反转C中字符串中的字符,但它不起作用。
这就是我所拥有的:
/* ... the */
char str[1000];
strcpy(&str[0], &text[0]); // get the values from existing 'char text[1000]'
if (DEBUG) printf("DEBUG: str value before reverse: %s\n", str);
// reverse the string
reverse(&str[0]);
if (DEBUG) printf("DEBUG: str value after reverse: %s\n", str);
/* ... */
调用'reverse'后,我的输出如下:
DEBUG: str value before reverse: this is a line of text
DEBUG: str value after reverse:
这是我的功能:
void reverse(char * str)
{
char str2[1000];
int i = 0;
// find the null in str
while (str[i] != '\0') {
i++;
}
// now put the chars from str into str2 in the reverse order
int j = 0;
while (i >= 0) {
str2[j] = str[i];
i--;
j++;
}
str2[j] = '\0';
// now str2 contains the reverse of str, copy it to str
strcpy(&str[0], &str2[0]);
return;
}
它出了什么问题?是否有更简单的方法来反转字符串?
答案 0 :(得分:2)
它出了什么问题?
第一个循环完成后,str[i]
等于0.因此,第二个循环的第一次迭代将空终止符存储在str2
的第一个位置,使其有效地成为长度为0的字符串当然它会继续并将其他字符写入缓冲区,但您使用的任何函数都会忽略这些字符。
是否有更简单的方法来反转字符串?
不确定。例如,this implementation就地反转字符串而不分配额外的缓冲区:
char *strrev(char *str)
{
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
答案 1 :(得分:1)
当str [i]为'\ 0'时你开始复制,所以你的字符串将从它开始并为空。
答案 2 :(得分:0)
我明白了。
在第一个while循环之后,我是'\ 0'的位置,我将它作为str2的第一个字符,因此str总是空字符串。