将字符串“Hello World”反转为“World Hello”,有什么问题?

时间:2012-02-03 04:40:24

标签: c

我想把“Hello World”变成“World Hello”。 但是代码没有按照我希望它的行为正常工作。 请参阅以下代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct llnode
{
    char *info;
    struct llnode *next;
};

typedef struct llnode NODE;

int main()
{
    char msg[50],word[10],*str;
    int i=0,length=0,j=0;
    NODE *ptr,*front=NULL,*temp,*last=NULL;

    //printf("Enter the sentence: ");
    str= "Hello World"; //fgets(msg,sizeof(msg),stdin);

    while(str[i]!='\0')
    {
        if((str[i]==' ')||(str[i]=='\n'))
        {
            word[j]='\0';
            j=0;
            ptr=(NODE *)malloc(sizeof(NODE));
            ptr->info=word;
            ptr->next=NULL;

            if(front==NULL)
            {
                front=ptr; // only change the value of front here;
            }
            else
            {
                temp=front;
                while((temp->next)!=NULL)
                {
                    temp=temp->next;
                }
                temp->next=ptr;
            }
            printf("\n##%s\n",front->info); // prints thewords and not
            //the first word
        }
        else
        {
            word[j]=str[i];
            j++;
        }
        i++;
    }

    temp=front;
    while(temp)
    {
        length++;
        printf("%s ",temp->info);
        temp=temp->next;
    }
    printf("\nLength of Linked List(or, number of words): %d\n",length);

    i=0;
    printf("\n************************\n");

    while(i<length)
    {
        temp=front;
        while(temp->next!=last)
        {
            temp=temp->next;
        }
        last=temp;
        printf("%s ",temp->info);
    i++;
}

return 0;
}

由于

8 个答案:

答案 0 :(得分:2)

代码存在许多问题:

您正在使用单个单词数组来阅读所有单词。因此,当您读取“Hello”时,您会读入单词数组,打印“## Hello”并将指针存储到单词数组中作为front-&gt; info。然后,你用World替换了word数组。另外,请注意,您永远不要添加带有“World”一词的节点,因为一旦遇到'\ 0'就退出循环。因此,您的链接列表只包含一个节点。但是,有一个问题,因为您在第一个节点中存储了指向字数组的指针,并且由于字数组已被“World”覆盖,因此当您退出循环时,列表​​中只有一个节点和信息这个节点是单词数组,其中包含“World”而不是像之前那样的“Hello”。那么,我想这解释了输出?

答案 1 :(得分:2)

您应该可以将strtok()用于此目的。看到这个example,只需用空格替换主题标签并向后打印。这是迄今为止实现这一目标的最简单方法。

答案 2 :(得分:1)

看起来像家庭作业......但是,首先,如果您的分隔符是空格和换行符:

if((str[i]==' ')||(str[i]=='\n'))

...然后在末尾不包含空格或换行符的字符串将永远不会解析最后一个元素:

str= "Hello World"; //fgets(msg,sizeof(msg),stdin);

...所以我的猜测是你甚至从未将“世界”放入链接列表中。

答案 3 :(得分:0)

最后我做了这个

   /**
    I am a boy -> boy a am I

    */
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
{
    int i, j, n, temp, temp_i, cnt;
    //char *array = "Samsung";
    char array[1000];
    char newarr[strlen(array)];
    printf("Enter The String: \n");
    gets(array);

    for(i = (strlen(array)-1), n = 0, j = 0; i >= 0; i--)
    {
     if( array[i] != ' ')
     {
         n++;
     }
     else
     {
         temp = n;
         temp_i = i;
         for(n = 0; n <= temp; n++)
         {
           //  i = i + 1;
             newarr[j++] = array[i++];
         }
         i = temp_i;
         n = 0;
     }

     if(i == 0)
     {
         newarr[j++] = ' ';
         temp = n;
         temp_i = i;
         for(n = 0; n <= temp; n++)
         {
           //  i = i + 1;
             newarr[j++] = array[i++];
         }
         i = temp_i;
         n = 0;
     }


     //newarr[j++] = array[i];
    }
    newarr[j] = '\0';
    cnt = 0;
    for(j = 0; j <= (strlen(newarr)-1); j++)/*This is not required just do some R n D*/
    {
        newarr[j] = newarr[++cnt];
    }
   //  printf("The first element is %c \n", newarr[1]);
    puts(newarr);
    return 0;
}

答案 4 :(得分:0)

这是一个使用c ++ 11的解决方案。根据需要反转单词并将其打印在屏幕上。

vector<string> words;
string str = "hello world c++11";

size_t current = 0;
size_t found = str.find(" ");

while(found != string::npos)
{
    words.push_back(str.substr(current, found - current));

    current = found + 1;
    found = str.find(" ",current);
}

words.push_back(str.substr(current));

std::ostream_iterator<string> Display_iter(std::cout," ") ;
std::copy(words.rbegin(), words.rend(), Display_iter); 

答案 5 :(得分:0)

1)首先反转整个字符串(它给出类似&#34; dlrow olleh&#34;) 2)然后从第一个字符调用/反转字,直到space / endOfString遇到。 3)它给出了所需的输出。

答案 6 :(得分:0)

的#include   #include

int main(){

  char *src = "I am a boy";
  char dest[50][50];
  int idx = 0;
  int priv_idx = 0;
  int i = 0;
  int j = 0;
  while(src[i] != '\0') {
      if(src[i] == ' ') {
          if(priv_idx == idx) {
              idx ++;
              j = 0;
          }
          i++;
          continue;
      }
      *(*(dest + idx) + j) = src[i];
      i++;
      j++;
      priv_idx = idx;
  }

  for (i = idx; i>=0; --i) {
      printf("%s\n\r",dest[i]);
  }

  return 0;

}

答案 7 :(得分:0)

#include <stdio.h>
#include <string.h>

#define MAX_ROW 50
#define MAX_COLUMN 50

char dest[MAX_ROW][MAX_COLUMN];

int str_rev_order(char *src)
{
    int idx = 0;
    int priv_idx = 0;
    int i = 0;
    int j = 0;

    for(i = 0;i<MAX_ROW; ++i) {
        memset(dest[i],0,MAX_COLUMN);
    }
    /* reset the counter */
    i = 0;
    while(src[i] != '\0') {
        if(idx >= MAX_ROW-1) {
            printf("Don't support more than %d substring.\n\r",MAX_ROW);
            return -1;
        }
        if(j >= MAX_COLUMN -1) {
            printf("Don't support string length more than %d.\n\r",MAX_COLUMN);
            return -1;
        }
        if(src[i] == ' ') {
            if(priv_idx == idx) {
                /* going to next row & reset the column counter*/
                idx ++;
                j = 0;
            }
            i++;
            continue;
        }
        *(*(dest + idx) + j) = src[i];
        i++;
        j++;
        priv_idx = idx;
    }
    return idx;

}

void print_rev_order(int idx) {
    int i;
    for (i = idx; i>=0; --i) {
        printf("%s\n\r",dest[i]);
    }
}

int main() {
    char *src = "I am a boy";
    int idx = str_rev_order(src);
    print_rev_order(idx);
    return 0;
}