字符串中的反向字

时间:2013-02-16 04:26:08

标签: c

出于某种原因,我无法让它发挥作用!谁能告诉我哪里出错了?这应该是反转给定字符串中的单词(即从“这是一个测试”到“测试一个就是这个”)

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

char *reverse(char const *input)
{
    char *ret = (char *)malloc(sizeof(char) * strlen(input));
    int length = 0;
    int numWords = 1;
    int i;
    for(i=0; input[i]!=NULL; i++)
    {
        length++;
        if(input[i]==' ')
            numWords++; 
    }
    char words[numWords];
    int currentWord = numWords;
    for(i=0; input[i]!=NULL; i++)
    {
        if (input[i]==' '){
            currentWord--;
        }else{
            words[currentWord] = words[currentWord] + input[i];
        }
    }
    for(i=0; i < numWords; i++)
    {
        ret = ret + words[i];
    }

    return ret;
}

int main(int argc, char **argv)
{
    int nTestcase = 0;
    int i = 0;
    char inputstr[100];
    char *reversedStr = NULL;
    scanf("%d\n", &nTestcase);
    for (i = 0; i < nTestcase; i++)
    {
        fgets(inputstr, 100, stdin);
        reversedStr = reverse(inputstr);
        printf("%s\n", reversedStr);
        free(reversedStr);
        memset(inputstr, 0, 100);
    }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

words[currentWord] = words[currentWord] + input[i];

您无法像期待字符串连接那样相互添加字符。我想你期望words是一个单词数组(即字符串),但它的类型不是那个,words只是一个字符数组。

就像@Tom所说,你在最后一个for循环中再次这样做:

ret = ret + words[i];

答案 1 :(得分:0)

Joseph,与其他编程语言(c#或PHP)不同,C语言的字符串处理功能非常基础。

您不能直接添加字符串,但是您可以使用许多库函数来完成相同的任务。

退房,

  • strtok - 用它将字符串拆分为单词。 strtok reference

  • strncat - 用于连接字符串

C中的

字符串只是以空字符结尾的字节数组(字节值为0)。

答案 2 :(得分:0)

这里更短/更干净

private char[] reverseWords(char[] words) {

    int j = words.length - 1;

    for (int i = 0; i < (words.length)/2; i++) {
        if(i==j)
            continue;

        char temp = words[i];
        words[i] = words[j];
        words[j]=temp;
        j--;
    }
    int lastIndex = 0;
    for (int i=0;i<words.length;i++){
        if(words[i]==' '){
            words = reverseWord(words,lastIndex,i-1);
            lastIndex=i+1;
        }
    }
    words = reverseWord(words,lastIndex,words.length-1);

    return words;
}

private char[] reverseWord(char[] words, int from, int to) {
    int j=to;
    for(int i=from;i<((to/2)+from/2);i++){
        if(i==j) continue;

        char temp = words[j];
        words[j]=words[i];
        words[i]=temp;
        j--;
    }
    return words;
}