2015-09-20 4 views
0

Мне задали вопрос с двумя частями. Часть A заключалась в том, чтобы перевернуть слова в строке с помощью строковых манипуляций, для которых я использовал strcpy и strcat. Однако для части B я должен перевернуть слова с помощью указателей. Теперь у меня есть код, показанный ниже. Я на правильном пути?Обратные слова в строке с помощью указателей

Мысль за моей функцией заключается в том, что у меня есть исходная строка string1, и у меня есть указатель на начальный символ, а затем итерация по строке до тех пор, пока я не ударил пустое пространство, давая мне размер слова. Затем я помещаю это слово в конец моей новой строки.

Код:

partb(char * string1, int s) 
{ 
    int i=0, j=0, k=0, count=0; 
    char temp[100]={0}, *sp=string1; 

    for(i=0; i<=s; i++) 
    { 
     if(isalnum(string1[i])) 
     { 
      k=i; 
      break; 
     } 
     break; 
    } 

    for(i=0; i<=s; i++) 
    { 
     if(isalnum(string1[i])) 
     { 
     count++; 
     } 
     else if(string1[i] == ' ') 
     { 
     for(j=0; j<=count; j++) 
     { 

     } 
     } 
    } 
} 
+3

Go один, пока не врезался в стену, а затем вернуться с вопросом, как продолжить. – alk

+0

«Часть A ... Я использовал' strcpy' и 'strcat'. Разве не разрешено определять вашу версию' strcpy' и 'strcat' с помощью арифметики указателей? Другими словами, разрешено ли сокращать часть В до части А? – nodakai

+0

@AndrewRicci Спасибо, что приняли мой ответ. Не могли бы вы также упредить его? –

ответ

0

Несколько наблюдений:

  • Как вы знаете, что temp будет достаточно большим, чтобы сохранить обратную строку? Вы должны выделить char *, который имеет тот же размер, что и входная строка.

  • Почему вы тестируете string1[i] == ' ', когда знаете, что isalnum(string1[i]) не соответствует действительности? Вы уже на разрыве слов, поэтому тест не нужен.

  • Вы забыли инициализировать count до 0 внутри цикла. Вы должны сбросить count каждый раз, когда вы сталкиваетесь с новым словом.

После исправления ошибок вы можете реализовать функцию с предлагаемым подходом, но я хотел бы предложить другой способ. Вместо использования count вы можете иметь пару индексов a и b, которые пересекают слово в противоположных направлениях.

Эта программа демонстрирует свой подход:

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

int isWordCharacter(char c) { 
    return isalnum(c); 
} 

char * reverseWords(char *s) { 
    int pos = 0, seek, a, b, len; 
    for (len = 0; s[len] != 0; ++len) { // Find the string length ourselves to 
    }          // avoid using anything from string.h. 
    char *result = malloc(len * sizeof(char)); 
    while (1) { 
    while (!isWordCharacter(s[pos])) { // Look for the start of a word. 
     result[pos] = s[pos]; 
     if (pos == len) {     // Are we at the end of the string? 
     return result; 
     } 
     ++pos; 
    } 
    for (seek = pos + 1; isWordCharacter(s[seek]); ++seek) { 
    }         // Look for the end of the word. 
    for (a = pos, b = seek - 1; a < seek; ++a, --b) { 
     result[b] = s[a];     // Scan the word in both directions. 
    } 
    pos = seek;       // Jump to the end of the word. 
    } 
} 

int main() { 
    char *s = "Hello, world. Today is September 20, 2015."; 
    printf("%s\n%s\n", s, reverseWords(s)); 
} 
+1

вы можете использовать библиотеку '', а затем использовать функцию' isalnum (char c) ', чтобы сделать то же самое, что и' isWordCharacter (char c) ' –

+0

Хорошая точка. Я сделаю это внутри 'isWordCharacter', чтобы сохранить его универсальным. –

Смежные вопросы