2013-02-16 2 views
-1

По какой-то причине я не могу заставить это работать! Может ли кто-нибудь сказать мне, где я ошибся? Предполагается, что это поменять местами слова в строке поддавки (т.е. от «это тест» на «испытание на это»)Обратные слова в строках

#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; 
} 
+0

У вас есть конкретный вопрос? Какая часть не работает? –

+0

что вы подразумеваете под этой строкой в ​​ваших кодовых словах [currentWord] = words [currentWord] + input [i]; ??? вы добавляете два символа и сохраняете их в другом! – 999k

+0

Выглядит слишком сложно. Почему вас волнует количество слов? Просто начните с конца и отсканируйте назад в поисках пробелов; когда вы его найдете, напечатайте часть строки, начиная с символа после пробела и заканчивая перед следующим пространством. – Caleb

ответ

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

Вы не можете добавлять символы друг к другу, как, что ожидает конкатенация строк. И я думаю, вы ожидаете, что words будет массивом слов (например, строк), но его тип не таков, words - это всего лишь массив символов.

Как @tom сказал, что вы делаете это снова в последний цикл:

ret = ret + words[i]; 
+2

в последнем цикле также использует '+' для конкатенации-ret = ret + words [i] – 999k

0

Джозеф, в отличие от других языков программирования (C# или PHP), для работы со строками функций C довольно проста.

Вы не можете добавлять строки напрямую, однако есть множество функций библиотеки, которые вы можете использовать для выполнения одной и той же задачи.

Заканчивать,

  • strtok - Используйте его, чтобы разбить строку на слова. strtok reference

  • strncat - Используется для конкатенации строк

строки в C просто массивы байт с концевыми нулевым символом (байт со значением 0).