Как предотвратить перезапись массивов символов для циклов for при использовании strcat - PullRequest
0 голосов
/ 21 сентября 2019

Всякий раз, когда слово из списка слов передается как правильное слово, вызывается strcat (code, wordlist [i]) для добавления слова в мировой список.

Так что, если в первой строке ставится «am», код = я.Или, если abhcgmsopa bqcedpwon abmnpc abcdponm dfajbbmmn cabnmo ставится в первой строке, три соответствующие слова будут добавлены.

Однако во второй строке значения в коде перезаписываются и дополнительные символы вставляются, даже если кодинициализируется вне цикла while и strcat должен добавлять значения в конец кода.Затем, когда цикл while заканчивается, код полностью заменяется на «xq», где x - первая буква, введенная в код, а q - «выход».Код не инициализируется и не изменяется, кроме того, что к нему добавлено.Как я могу предотвратить это?

Спасибо

* Редактировать: я определил некоторые функции стека перед основной, но отредактировал здесь, чтобы минимизировать код


int main(int argc, char const *argv[])
{
  char input[300];
  char code[]="";
  int ci;

     /* set up an infinite loop */
 while (1)
 {
   //break;
   /* get line of input from standard input */
   printf ("\nEnter input to check or q to quit\n");
   fgets(input, 300, stdin);

   /* remove the newline character from the input */
   int i = 0;
   while (input[i] != '\n' && input[i] != '\0')
   {
      i++;
   }
   input[i] = '\0';


   /* check if user enter q or Q to quit program */
   if ( (strcmp (input, "q") == 0) || (strcmp (input, "Q") == 0) )
     break;

   /*Start tokenizing the input into words separated by space
    We use strtok() function from string.h*/
   /*The tokenized words are added to an array of words*/

   char delim[] = " ";
   char *ptr = strtok(input, delim);
   int j = 0 ; 
   char *wordlist[300];


    while (ptr != NULL)
    {   
        wordlist[j++] = ptr;
        ptr = strtok(NULL, delim);

    }

   /*Run the algorithm to decode the message*/
   //j=words in line;i=i-th word we are evaluating
   //k=k-th letter in i-th word

   stack1 st;

   for(int i=0;i<j;i++){

      //stack1 st;
      init(&st);
      for(int k=0;k<strlen(wordlist[i]);k++){
         if((int)wordlist[i][k]<101 && (int)wordlist[i][k]>96){ //check if this letter is a/b/c/d with ascii
            push(&st,&wordlist[i][k]);
            printf("%c added\n",st.ptr[st.inUse-1]);
         }
         else{
           if(wordlist[i][k]==top(&st)+12){ //check if letter is m/n/o/p corresponding to a/b/c/d from top()
             pop(&st);          
           }
         }
      }
      if(is_empty(&st)){
        printf("%s is valid\n",wordlist[i]);
        strcat(code,wordlist[i]);
        strcat(code," ");

      }
      else{
        printf("%s is invalid\n",wordlist[i]);
        clear(&st);

      }
      printf("code:%s\n",code);
   }
   printf("code after loop: %s",code);
 }
 printf("code: %s\n",code);
 for(int i=0;i<300;i++){
   if ((int)code[i]<101 && (int)code[i]>96){
     printf("%c",code[i]);
   }
   if(!((int)code[i]<96+26 && (int)code[i]>96)){
     printf(" ");
   }
 }
 printf("code:%s",code);
 printf ("\nGoodbye\n");

    return 0;
}


1 Ответ

0 голосов
/ 21 сентября 2019

Проблема в том, что ваша переменная code представляет собой массив из 1 символа!Эта строка:

char code[]="";

объявляет ее как пустую строку (без символов) плюс нулевой терминатор.

Вам необходимо назначить его как массив, достаточно большой, чтобы вместить максимально возможный ответ!Если это, скажем, 500, то используйте это:

char code[500]="";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...