使用c使用指针反转句子中的单词

时间:2014-04-16 17:14:54

标签: c pointers

我正在编写一个程序,其中的函数可以反转字符串中的每个单词。当我调用该函数时,它会将指针传递给源字符串,然后将指针返回到已修改的字符串。

输入:为什么总是我? 输出: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中),然后程序停止工作。

任何帮助都将不胜感激。

3 个答案:

答案 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;
}