Как поменять слова одно за другим в c, используя указатели и массивы - PullRequest
3 голосов
/ 25 мая 2011

Эй, да, ты угадал это домашнее задание.Я пытаюсь напечатать строку в обратном порядке, используя указатели.Только слова, хотя.Так что "Привет, мир" - это "Олле Длроу".В приведенном ниже коде я назначаю один указатель (pSentence, который представляет собой строковый массив из нескольких слов, передаваемых из основной функции) временному указателю до пробела, затем увеличивает его в обратном направлении и печатает символ из временного указателя.в начале слова, затем сделайте это снова.В данный момент я застрял, я не знаю, как пометить начало слова и увеличить только до этого.Я знаю, что while (pt! = '0') вовсе не способ сделать это.В подсказке говорится, чтобы сохранить слово во временной строке (tmpStrg) и использовать pT, чтобы указать на него, поэтому, возможно, мне нужно что-то сделать с tmpStrg?Любая помощь высоко ценится и спасибо заранее!

void prtWords(char *pSentence)
{
    char tmpStrg[81], *pT=tmpStrg;
    int length=0;

    while(*pSentence != '\0')
    {
       while(*pSentence != ' ' && *pSentence != '/0')
       {
         *pT=*pSentence;
         pT++;
         pSentence++;
         length++;
       }
       pSentence++;

       while(length >= 0);
       {
         printf("%c", *pT);
         pT--;
         length--;
       }
    }
}

Ответы [ 2 ]

1 голос
/ 25 мая 2011

@ Комментарий Дак "Разбей проблему на части". был замечен и подчеркивает один из самых важных методов проектирования / программирования.

Я не знаю, какие фреймворки для модульного тестирования чаще всего используются для тестирования кода на C, но для начала лучше написать несколько тестов.

Этот код может быть не совсем тем, что вы ищете, поскольку он выполняет свою работу на месте:

void ReverseInPlace(char * pstart, char * pend)
{
    char tmp;

    while (pend > pstart)
    {
        tmp = *pstart;
        *pstart++ = *pend;
        *pend-- = tmp;
    }
}

void ReverseWordsInPlace(char *pSentence) 
{
    char * pstart;
    char * pend; 
    pstart = pSentence;

    while (*pstart != '\0')
    {
        // skip any (multiple) starting spaces
        while (*pstart == ' ')
        {
            pstart++;
        }

        pend = pstart;

        // find end of word (terminated by a space or end of string)
        while (*pend != ' ' && *pend != '\0')
        {
            pend++;
        }

        // check if anything left to do
        if (pstart >= pend - 1)
            return;

        ReverseInPlace(pstart, pend - 1);

        pstart = pend;
    }
}

int main(int argc, char * argv[])
{

char string1[] = "The quick brown fox jumped over the lazy dog";
char string2[] = "_";
char string3[] = " ";
char string4[] = " another";
char string5[] = "hello ";  
char string6[] = "";
char string7[] = "  ab";

 ReverseWordsInPlace(string1);
 ReverseWordsInPlace(string2);
 ReverseWordsInPlace(string3);
 ReverseWordsInPlace(string4);
 ReverseWordsInPlace(string5);
 ReverseWordsInPlace(string6);
 ReverseWordsInPlace(string7);

printf("%s\n", string1);
printf("%s\n", string2);
printf("%s\n", string3);
printf("%s\n", string4);
printf("%s\n", string5);    
printf("%s\n", string6);
printf("%s\n", string7);

return 0; 
}
1 голос
/ 25 мая 2011
void prtWords(char *pSentence)
{
    char tmpStrg[81], *pT=tmpStrg;

В соответствии с вашим кодом, я предполагаю, что здесь вы используете tmpStrg[81] в качестве новой строки для слова и позже печатаете слово в обратном порядке.

    int length=0;
    while(*pSentence != '\0')
    {
       while(*pSentence != ' ')
       {

Вот ваша проблема с переполнением, вы должны одновременно протестировать \0 и (и изменить второе while на && с первым while без изменений). Нет никакой гарантии, что предложение закончится .

         *pT=*pSentence;
         pT++;
         pSentence++;
         length++;
       }
       pSentence++;
       while(length >= 0);

Когда length равен 0, вы не должны ничего делать. Изменить на >.

       {
         printf("%c", *pT);

Сначала вы должны сделать pT--, потому что последний pT++ не имеет назначения.

         pT--;
         length--;
       }

Здесь выведите при *pSentence == ' '.

    }
}

Составьте полный код самостоятельно, так как это домашнее задание. Любые дополнительные вопросы приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...