Как выполнить изменение предложения слово за словом в C? - PullRequest
1 голос
/ 09 марта 2012
#include <stdio.h>

int main(void)
{
  int i,j;
  int wordstart = -1;
  int wordend = -1;
  char words[]= "this is a test";
  char temp;

  // Reverse each word
  for (i = 0; i < strlen(words); ++i)
  {
    wordstart = -1;
    wordend = -1;
    if(words[i] != ' ') 
      wordstart = i;
    for (j = wordstart; j < strlen(words); ++j)
    {
      if(words[j] == ' ')
      {
        wordend = j - 1;
        break;
      }
    }
    if(wordend == -1)
      wordend = strlen(words);
    for (j = wordstart ; j <= (wordend - wordstart) / 2; ++j)
    {
      temp = words[j];
      words[j] = words[wordend - (j - wordstart)];
      words[wordend - (j - wordstart)] = temp;
    }
    i = wordend;
    printf("reversed string is %s:", words);
  }
}

Я пытался таким образом, но я получаю этот вывод:
siht is a test
мой ожидаемый результат:
test a is this

Буду признателен, если кто-нибудь придет с другим подходом, для которого временная сложность очень мала, или поправит меня, если это правильный подход. Спасибо

Ответы [ 12 ]

1 голос
/ 09 марта 2012

Возможно, это относится к сайту проверки кода?

Ваш подход мне кажется очень эффективным (за исключением того, что я бы назвал strlen (слова) один раз и сохранил результат в регистре).

Две возможные ошибки выглядят так:

wordend = strlen(words);

должно быть

wordend = strlen(words)-1;

и

for(j = wordstart ; j <= (wordend - wordstart) / 2 ; ++j) {

должно быть

for(j = wordstart ; j <= (wordend + wordstart) / 2 ; ++j) {

Окончательный код выглядит следующим образом (с некоторыми дополнительными {}):

    #include <stdio.h>
    int main(int argc,char *argv[])
    {
        int i,j;
        char words[]= "this is a test";
        int L=strlen(words);

        // Reverse each word
        for(i = 0; i < L; ++i) {
          int wordstart = -1;
          int wordend = -1;
          if(words[i] != ' ') 
          {
            wordstart = i;

            for(j = wordstart; j < L; ++j) {
              if(words[j] == ' ') {
                wordend = j - 1;
                break;
              }
            }
            if(wordend == -1)
              wordend = L-1;
            for(j = wordstart ; j <= (wordend + wordstart) / 2 ; ++j) {
              char temp = words[j];
              words[j] = words[wordend - (j - wordstart)];
              words[wordend - (j - wordstart)] = temp;
            }
            i = wordend;
          }
        }
        printf("reversed string is %s:",words);
        return 0;   
    }
1 голос
/ 04 августа 2016

Просто мы можем просто использовать * 1 2D массив символов, приспособленный к нашим потребностям !!!

#include <stdlib.h>

int main()
{
    char s[20][20];
    int i=0, length=-1;
    for(i=0;;i++)
    {
        scanf("%s",s[i]);
        length++;
        if(getchar()=='\n')
            break;
    }
    for(i=length;i>=0;i--)
        printf("%s ",s[i]);
    return 0;
}
1 голос
/ 09 марта 2012

Вы можете создать двойной связанный список в качестве базовой структуры данных.Затем итерируйте слова и вставляйте их в список по мере их нахождения.

Когда вы дойдете до конца предложения, просто просмотрите список в обратном направлении и распечатайте слова по мере их прохождения

0 голосов
/ 28 мая 2017
using stack 

#include <iostream>  
#include <stdio.h>
#include <stack>

int main()
{ 

    std::stack<string> st;
    char *words= "this is a test";
    char * temp =   (char *)calloc(1, sizeof(*temp));
    int size1= strlen(words);
    int k2=0;
    int k3=0;
    for(int i=0;i<=size1;i++)
    {
       temp[k2] = words[i];
       k2++;
        if(words[i] == ' ')     
        {  
            k3++;
            if(k3==1)
                temp[k2-1]='\0';

            temp[k2]='\0';
            st.push(temp);
            k2=0;           
        }
        if(words[i] == '\0')
        {
            temp[k2]='\0';
            st.push(temp);
            k2=0;
            break;
        }               
    }

  while (!st.empty())
  {
       printf("%s",st.top().c_str());
        st.pop();
  }
0 голосов
/ 01 июля 2016

Мой код, просто переход от последнего, и если вы найдете пробел, напечатайте символы перед ним, теперь измените конец на пробел-1, это будет печатать до второго слова, в конце концов, просто напечатать первое слово, используя один дляloop.Comment для изменения подхода.

Программа:

#include<stdio.h>
int main()
{
 char str[200];
int i,j,k;
scanf("%[^\n]s",&str);
for(i=0;str[i]!='\0';i++);
i=i-1;
for(j=i;j>=0;j--)
{
    if((str[j])==' ')
    {
        for(k=j+1;k<=i;k++)
        {
            printf("%c",str[k]);
        }
        i=j-1;
        printf(" ");
    }

}
for(k=0;k<=i;k++)
{
    printf("%c",str[k]);
}
}
0 голосов
/ 22 июня 2016

Используйте основной цикл for для обхода до конца предложения: копируйте буквы в строку, пока не найдете пробел.Теперь вызовите функцию add@beginning и в этой функции добавляйте строку каждый раз, когда вы передаете строку в связанный список.выведите содержимое связанного списка с пробелом между ними, чтобы получить ожидаемый результат

0 голосов
/ 03 августа 2015
#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
char st[50], rst[50];
printf("Enter the sentence...\n");
gets(st);
int len=strlen(st), p;
int j=-1,k;
p=len;
for(int i=(len-1); i>=0; i--)
{
    //searching for space or beginning
    if(st[i]==' ')
    {
        //reversing and storing each word except the first word
        for(k=i+1;k<p;k++)
        {
            //printf("%c",st[k]);
            rst[++j]=st[k];
        }
        j++;
        rst[j]=' ';
        printf("\n");
        p=i;
    }
    else if(i==0)
    {
        //for first word
        for(k=i;k<p;k++)
        {
            //printf("%c",st[k]);
            rst[++j]=st[k];
        }
    }

}
printf("Now reversing the sentence...\n");
puts(rst);
return 0;
}
0 голосов
/ 26 февраля 2014
 #include <iostream>
 #include <string>   
  using namespace std;
  char* stringrev(char s[], int len)
  {
    char *s1 = (char*)malloc(len+1);
    int i=0;
    while (len>0)
    {
      s1[i++] = s[--len];
    }
   s1[i++] = '\0';
    return s1;   
  }

   void sentrev(char s[], int len)
 {
    int i=0; int j=0;
     char *r = (char*)malloc(len+1);
     while(1)
     {
     if(s[j] == ' ' || s[j] == '\0')
     {
       r = stringrev(s+i, j-i);
       i = j+1;
       cout<<r<<" ";
     }
    if (s[j] == '\0')
    break;
    j++;
   }

 }


int main()
{
char *s = "this is a test";
char *r = NULL;
int len = strlen(s);
cout<<len<<endl;
r = stringrev(s, len);
cout<<r<<endl;
sentrev(r, len);
return 0;
}

Приведенный выше код переворачивает предложение, используя char * r и печать cout <

0 голосов
/ 09 марта 2012
#include<stdio.h>
#include<string.h>

void reverse(char *str, size_t len)
{
    char tmp;
    size_t beg, end;
    if (len <=1) return;

    for (beg=0,end=len; beg < --end ; beg++) {
        tmp = str[beg];
        str[beg] = str[end];
        str[end] = tmp;
    }
}

int main(void)
{
    char sentence[] = "one two three four five";
    size_t pos, len;

    printf("Before:%s\n",sentence);
    for (pos = len= 0;  sentence[pos]; pos += len) {
        pos += strspn( sentence+pos, " \t\n" );
        len = strcspn( sentence+pos, " \t\n" );
        reverse ( sentence + pos, len );
        }
    reverse ( sentence , pos );

    printf("After:%s\n",sentence);

    return 0;
}
0 голосов
/ 09 марта 2012
if(words[i] != ' ') 
    wordstart = i;

Это утверждение как насчет остальной части? если слова [i] == '', а wordstart остается -1. Поэтому, возможно, попробуйте использовать:

while (words[i] && words[i] == ' ') ++i;
  if (!words[i])
      break;
wordstart = i;

Затем вы должны вывести результат из цикла i. Наконец, если вы хотите получить ожидаемый результат, вам следует еще раз полностью изменить предложение, как вы его использовали в цикле.

...