簡體   English   中英

如何使用指針和 arrays 在 c 中逐個反轉單詞

[英]How to reverse words one by one in c using pointers and arrays

嘿,是的,你猜對了家庭作業。 我正在嘗試使用指針反向打印字符串。 雖然只有文字。 所以“hello world”就是“olleh dlrow”。 我在下面的代碼中所做的是將一個指針(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--;
       }
    }
}
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);

length0時,你不應該做任何事情。 更改為>

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

你應該先做pT-- ,因為最后一個pT++沒有賦值。

         pT--;
         length--;
       }

這里打印一個*pSentence == ' '

    }
}

自己編寫完整的代碼,因為這是家庭作業。 歡迎任何進一步的問題。

@Duck 的評論“將問題分解成碎片。” 很到位,並強調了最重要的設計/編程技術之一。

我不熟悉最常用於測試 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; 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM