2012-02-03 4 views
1

Я пытаюсь сделать «Hello World» «World Hello». Но код не работает должным образом, как я хотел, чтобы он себя вел. Смотрите ниже код:Обратить строку «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; 
} 

Благодаря

+0

является то, что домашние задания? – Ben

+0

@Ben: Это не домашнее задание, но вчера я проходил через один веб-сайт, там я нашел этот вопрос. Так подумал написать программу. Но этого не происходит. –

+2

Перемещенный код через SO - пожалуйста, не помещайте свой код на другие сайты, а затем ссылайтесь на них, мы хотим, чтобы SO был полезен, даже если весь остальной интернет попадает в черную дыру. О, да, и вам, возможно, захочется учиться на отступ немного лучше, я исправил это и для вас :-) – paxdiablo

ответ

2

Есть целый ряд вещей, не так с кодом:

Вы используете один массив слов, чтобы прочитать все слова. Итак, когда вы читаете «Привет», вы читаете в массиве слов, печатаете «## Hello» и сохраняете указатель на массив слов как front-> info. Затем вы переводите массив слов с помощью World. Также обратите внимание, что НИКОГДА не добавляйте узел со словом «Мир», потому что вы выходите из цикла, как только вы сталкиваетесь с «\ 0». Таким образом, ваш связанный список содержит только один узел. Но есть проблема, так как вы сохранили указатель на массив слов в первом узле и, поскольку массив слов был перезаписан «World», когда вы выходите из цикла, в списке есть только один узел, а информация этого узла является массив слов, который содержит «Мир», а не «Привет», как это когда-то было. Итак, я думаю, это объясняет результат?

1

Похоже, домашнее задание ... но, для начала, если ваши разделители пробел и символ новой строки:

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

... тогда строка, которая не содержит пробел или новой строки в конец никогда не будет анализировать последний элемент:

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

... так что я предполагаю, что вы никогда не помещаете «Мир» в связанный список.

2

Для этой цели вы должны использовать strtok(). См. Это example, просто замените хэштеги пробелами и распечатайте назад. Это, безусловно, самый простой способ добиться этого.

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; 
} 
+0

В Python 'print ('' .join (list (string.split ('')) [:: - 1]))' –

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); 
0

1) Во-первых реверс всю строку (она дает как "dlrow olleh") 2), а затем позвонить/реверсного слово от первого символа до пространства/endOfString встреч. 3) Он дает желаемый выход.

0

#include #include

INT Основной() {

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; 

}

+1

Добро пожаловать в stackoverflow. Хорошо, что вы предоставили правильный код, но вы можете улучшить свой ответ, указав, как это правильно и что было неправильно в коде, указанном в вопросе – Ayushya

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