无法反转字符串的某些部分

时间:2017-03-21 21:03:46

标签: c string reverse

当我决定尝试时,这似乎是一个简单的想法,但知道它让我疯了。 我可以反转整个字符串,但现在我试图反转字符串的各个部分。 示例:

"pizza is amazing"  to "azzip si amazing"

基本上我的程序应该从 a点到b 反转一个字符串,分别对其中的任何单词进行处理。我的逻辑看似正确(至少对我而言),但显然有些错误,因为我的输出只是第一个单词"pizza"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *reverse(char *a, int i, int j){    //reverse the words
    char temp;
    while(i<j){
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
        i++;
        j--;
    }
    return a;
}

char *words(char *a, int i, int j){    // identify if there are any words from a-b
    int count = i;
    while(i<j){
        if(a[i] == ' '){           // a space signifies the end of a word
            reverse(a , i-count, i);
                    count = 0;         //reset count for next word
            }
        i++;
        count++;
    }
    return a;
}

int main(){
    char a[50];
    char *a2;
    printf("Enter a string:\n);      //string input
    scanf("%s", a);

    int strlength = strlen(a) + 1;
    a2 = (char *)malloc(strlength*sizeof(char));
    strcpy( a2, a);

    printf("Reversed string:\n%s", words(a, 0, 4));  // create a-b range
    return 0;
}

我意识到我的问题很可能在words()之内。我没有想法。

1 个答案:

答案 0 :(得分:0)

问题1:

您应该更加谨慎地命名变量,可理解且有意义的名称可以帮助程序员和其他人阅读代码。请记住,这非常重要。

问题2:

当您将参数%s传递给scanf()时,它将读取后续字符,直到找到空格(空格字符被视为空白,换行符和制表符)。

您可以使用scanf("%[^\n]", a)读取所有字符,直到找到换行符。

有关scanf()的进一步参考,请查看here

问题3:

看一下words()函数,你没有存储基本索引(从哪里开始反转)。对reverse()的调用告诉它要反转单个字符(没有任何变化)。

你没有指定整个单词是否必须在范围内才能被反转,或者即使它在边缘(例如:一半,一半)。我假设整个单词必须在范围内,请查看words()函数的此修改版本:

char *words(char *str, int fromIndex, int toIndex){

    int i = fromIndex;
    int wordStartingIndex = fromIndex;

    /* 
    It is necessary to expand the final index by one in order
    get words bounded by the specified range. (ex: pizza (0, 4)).
    */

    toIndex += 1;

    /* Loop through the string. */

    while(i <= toIndex){

        if(str[i] == ' ' || str[i] == '\0' || str[i] == '\n'){

            reverse(str, wordStartingIndex, i-1);

            wordStartingIndex = (i + 1);

        }

        i++;

    }

    return str;
}

这应该让你开始。功能并不完美,您需要对其进行修改以处理一些特殊情况,例如我提到的情况。