我正在编写一个程序,其中的函数可以反转字符串中的每个单词。当我调用该函数时,它会将指针传递给源字符串,然后将指针返回到已修改的字符串。
输入:为什么总是我? 输出:yhW syawla?em
但由于某种原因,它不起作用。没有错误。逻辑对我来说似乎很好(我对c不是那么好,顺便说一句) 这是我的代码:
char *reverse_words(char *source_string)
{
char *startW, *endW;
startW = source_string;
while(*startW != '\0')
{
while(*startW == ' ')
startW++; //Skip multiple spaces in the beginning
endW = startW;
while(*endW != ' ' || *endW != '\0')
endW++;
char *_start = startW;
char *_end = endW - 1;
char temp;
while(_end > _start)
{
temp = *_start;
*_start++ = *_end;
*_end++ = temp;
}
startW = endW;
}
return source_string;
}
void main() {
char *s;
s = malloc(256);
gets(s);
printf("%s\n", s);
char *r = reverse_words(s);
printf("\nReversed String : %s",r);
free(s);
free(r);
}
另外,我正在使用codeblocks IDE。在我输入我的字符串后,它将其打印回来(scanf和printf在main中),然后程序停止工作。
任何帮助都将不胜感激。
答案 0 :(得分:2)
首先,
while(*endW != ' ' || *endW != '\0')
是一个无限循环,试试这个:
while(*endW != ' ' && *endW != '\0')
其次,
*_end++ = temp;
应该是这样的:
*_end-- = temp;
答案 1 :(得分:0)
在最里面的while(_end > _start)
循环中,您可以增加_start
和_end
。所以情况永远不会变错。 (好吧,直到_end
溢出。)
我建议您了解如何在IDE中逐步进行调试。然后你可以很容易地理解在这种情况下究竟出现了什么问题,而不用模拟头脑中的执行。
答案 2 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
char *reverse_words(const char *source_string){
const char *startW, *endW;
char *p, *rev = malloc(256);
startW = source_string;
p = rev;
while(*startW != '\0'){
while(*startW == ' ')
*p++ = *startW++;
if(!*startW)
break;
endW = startW;
while(*endW != ' ' && *endW != '\0')
endW++;
const char *endW2 = endW;
do{
*p++ = *--endW;
}while(startW!=endW);
startW = endW2;
}
*p = '\0';
return rev;
}
int main() {
char s[256];
scanf("%255[^\n]", s);
printf("%s,\n", s);
char *r = reverse_words(s);
printf("\nReversed String : %s.", r);
free(r);
return 0;
}