Привет, я пытался заставить эту программу запускаться несколько раз (используя for (;;) и do ... while), но каждый раз останавливается на чтении строки - PullRequest
0 голосов
/ 27 декабря 2018

Я создал эту программу для чтения строки от пользователя и сортировки ее слова в алфавитном порядке, наконец, я попытался добавить функцию, которая помогает мне запускать эту программу столько, сколько хочет пользователь, но никогда не работает.Я использовал do ... while, но каждый раз, когда программа останавливается перед чтением строки.

char *words[L];
char *word;
char sentence[100];
int i = 0, nrCuvinte = 0;
    int j, k, ok, n, lung;


for(j=0;j<L;++j)
{
    words[j] = (char*)malloc(L*sizeof(char));
}
printf("Enter any sentence you want: \n");

fgets(sentence,99,stdin);
lung = strlen(sentence);

if(sentence[lung-1] == '\n')
{
    sentence[lung-1] = '\0';
}
printf("\n");

word = strtok(sentence, " .,-;/?!");
for(j=0;j<(strlen(word)+1);j++)
{
    word[j] = tolower((unsigned char) word[j]);
}
while(word != NULL)
{
    for(j=0;j<(strlen(word)+1);j++)
    {
        word[j] = tolower((unsigned char) word[j]);
    }
    strcpy(words[i],word);
    word = strtok(NULL, " .,-;/?!");
    ++i;
    ++nrCuvinte;

}

n = nrCuvinte-1;
do{
    ok =1;
    for(k=0;k<n;++k)
    {
        if(strcmp(words[k],words[k+1])>0)
        {
            char *aux;
            aux = words[k];
            words[k] = words[k+1];
            words[k+1]= aux;
            ok = 0;
        }
    }
    --n;
}while(n>0&&(ok==0));

for(j=0;j<nrCuvinte;++j)
{
    puts(words[j]);
}
for(j=0;j<L;++j)
{
    free(words[j]);
    words[j]=0;
}

1 Ответ

0 голосов
/ 27 декабря 2018

Я добавил #includes, #define для L, обернул все внутри функции main и поместил цикл while(1) внутри функции main.В начале цикла while(1) я добавил nrCuvinte = 0; и i = 0; для сброса этих переменных.Я также добавил возможность вырваться из цикла while(1), введя «да», когда меня об этом попросят.

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

#define L 500

int main(){

  char user_input[4];
  char *words[L];
  char *word;
  char sentence[100];
  int i = 0, nrCuvinte = 0;
  int j, k, ok, n, lung;

  while(1){
    i = 0;
    nrCuvinte = 0;
    for(j=0;j<L;++j){
      words[j] = (char*)malloc(L*sizeof(char));
    }
    printf("Enter any sentence you want: \n");

    fgets(sentence,99,stdin);
    lung = strlen(sentence);

    if(sentence[lung-1] == '\n'){
      sentence[lung-1] = '\0';
    }
    printf("\n");

    word = strtok(sentence, " .,-;/?!");
    for(j=0;j<(strlen(word)+1);j++){
      word[j] = tolower((unsigned char) word[j]);
    }
    while(word != NULL)
    {
      for(j=0;j<(strlen(word)+1);j++){
        word[j] = tolower((unsigned char) word[j]);
      }
      strcpy(words[i],word);
      word = strtok(NULL, " .,-;/?!");
      ++i;
      ++nrCuvinte;
    }

    n = nrCuvinte-1;
    do{
      ok =1;
      for(k=0;k<n;++k){
        if(strcmp(words[k],words[k+1])>0)
        {
          char *aux;
          aux = words[k];
          words[k] = words[k+1];
          words[k+1]= aux;
          ok = 0;
        }
      }
      --n;
    }while(n>0&&(ok==0));

    for(j=0;j<nrCuvinte;++j){
      puts(words[j]);
    }
    for(j=0;j<L;++j){
      free(words[j]);
    }
    printf("If you want to exit type 'yes', else press enter.\n");
    fgets(user_input,4,stdin);
    if(strcmp(user_input, "yes") == 0)
      break;
  }
}

Я также написал другую версию, на этот раз оборачивая ваш код внутри функции ивызов этой функции из главной функции внутри цикла while(1):

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

#define L 500

void sort_sentence(){
  char *words[L];
  char *word;
  char sentence[100];
  int i = 0, nrCuvinte = 0;
  int j, k, ok, n, lung;

  for(j=0;j<L;++j)
  {
    words[j] = (char*)malloc(L*sizeof(char));
  }
  printf("Enter any sentence you want: \n");

  fgets(sentence,99,stdin);
  lung = strlen(sentence);

  if(sentence[lung-1] == '\n'){
    sentence[lung-1] = '\0';
  }
  printf("\n");

  word = strtok(sentence, " .,-;/?!");
  for(j=0;j<(strlen(word)+1);j++){
    word[j] = tolower((unsigned char) word[j]);
  }
  while(word != NULL){
    for(j=0;j<(strlen(word)+1);j++){
      word[j] = tolower((unsigned char) word[j]);
    }
    strcpy(words[i],word);
    word = strtok(NULL, " .,-;/?!");
    ++i;
    ++nrCuvinte;

  }

  n = nrCuvinte-1;
  do{
    ok =1;
    for(k=0;k<n;++k){
      if(strcmp(words[k],words[k+1])>0){
        char *aux;
        aux = words[k];
        words[k] = words[k+1];
        words[k+1]= aux;
        ok = 0;
      }
    }
    --n;
  }while(n>0&&(ok==0));

  for(j=0;j<nrCuvinte;++j){
    puts(words[j]);
  }
  for(j=0;j<L;++j){
    free(words[j]);
  }

}

int clean_stdin()
{
  while (getchar()!='\n');
  return 1;
}

int main(){

  int user_input;
  char c;

  while(1){
    sort_sentence();
    do{
      printf("If you want to exit type '2', if you want to continue type '1'.\n");
    }while(((scanf("%d%c", &user_input, &c) != 2 || c!='\n') && clean_stdin()) ||( user_input != 2 && user_input != 1));
    if(user_input == 2)
      return 0;
  }
}

Редактировать: Теперь во втором примере кода пользователю будет предложено сообщение с указанием ему / ему ввести 1 или 2, пока он/ Она вводит 1 или 2, каждый второй ввод приводит к тому, что снова появляется сообщение с тем же сообщением.Если введено 1, выполняется следующий вызов функции sort_sentence (), если считано 2, программа завершается. Кредиты перейдите на MOHAMED за его элегантное решение в вики сообщества.Я использовал его идею здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...