如何使用指针和数组在c中逐个反转单词

时间:2011-05-25 00:49:32

标签: c pointers

嘿,是的,你猜对了它的作业。我正在尝试使用指针反向打印字符串。只有这些话。所以“你好世界”就是“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--;
       }
    }
}

2 个答案:

答案 0 :(得分:1)

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

根据你的代码,我想你在这里使用tmpStrg[81]作为一个单词的新字符串,然后你以相反的顺序打印这个单词。

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

以下是您的溢出问题,您应该同时测试\0(并将第二个while更改为&&第一个{{1}不变)。无法保证句子以while结尾。

*pT=*pSentence; pT++; pSentence++; length++; } pSentence++; while(length >= 0); length时,您不应该做任何事情。更改为0

>

您应该先 { printf("%c", *pT); ,因为上一个pT--没有作业。

pT++

此处 pT--; length--; } 时打印

*pSentence == ' '

自己编写完整的代码,因为它是家庭作业。欢迎任何进一步的问题。

答案 1 :(得分:1)

@ 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; 
}