Разбор строки в C, без Strtok () - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно проанализировать строку в C, удалив из нее все не алфавитные символы.Для этого я проверяю значение ascii каждого символа и проверяю его правильность.Это работает так, как я хочу, так что это не проблема.Однако у меня возникают проблемы с сохранением результирующих строк после завершения анализа.(Кстати, я на 3 недели в C) Также, если вы заметили, что я использовал странные размеры для массивов, это потому, что я специально сделал их больше, чем они должны быть.

char * carry[2]; // This is to simulate argv
carry[1] = "hello1whats2up1"; // 0 is title so I placed at 1

char array[strlen(carry[1])]; // char array of string length
strcpy(array, carry[1]); // copied string to char array

char temp[strlen(carry[1]) + 1]; // Reusable char array
char * finalAnswer[10];

int m = 0, x = 0; // Indexes

if ((sizeof(carry))/8 > 1) { // We were given arguments

    printf("Array: %lu\n\n", sizeof(array));
    for (int i = 0; i < sizeof(array); i++)
    {
        if(isalpha(array[i])) { // A-Z & a-z
            //printf("%s\n", temp);
            temp[x] = array[i]; // Placing chars in temp array
            x++;

        }
        else {
            printf("String Length: %lu \nString Name: %s \nWord Index: %d \n\n",
                   strlen(temp), temp, m); // Testing Purposes
            strcpy(finalAnswer[m], temp); // Copies temp into the final answer *** Source of Error

            for(int w = 0; w < sizeof(temp); w++) { temp[w] = '\0'; } // Clears temp

            x = 0;
            m++;
        }
    }
    printf("String Length: %lu \nString Name: %s \nWord Index: %d \n",
           strlen(temp), temp, m); // Testing Purposes
    strcpy(finalAnswer[m], temp);

    for(int w = 0; w < sizeof(temp); w++) { temp[w] = '\0'; } // Clears temp

    x = 0;
}

else { printf("No Arguments Given\n"); }

printf("\n");

** Редактировать

Я получаю ошибку, когда пытаюсь скопировать temp в finalAnswer

** Edit 2

Я решил проблему с char * finalAnswer [10]

Когда я пытался использовать strcpy в finalAnswer, я никогда не указывал размер, необходимый для хранения конкретной строки.Хорошо работает после того, как я это сделал.

1 Ответ

0 голосов
/ 14 февраля 2019

Поскольку вы решили фактический разбор строки, ваш последний комментарий я приму в качестве фактического требования.

"... Я хочу создать список слов различной длины, к которым могут обращатьсяindex ... "

Эту задачу, конечно, нелегко решить, если" три недели в C ".Структура данных, представляющая, что это main() второй аргумент:

        // array (of unknown size)
        // of pointers to char
        char * argv[] ;

Это можно записать как указатель на указатель:

        // same data structure as char * []
        char ** list_of_words ;

И это толкает вас прямо вглубокие воды C. Нетривиальная структура данных C.Таким образом, это может потребовать чуть более четырех недель C.

Но мы можем быть творческими.Существует «встроенная в C» одна нетривиальная структура данных, которую мы могли бы использовать.Файл.

Мы можем записать слова в файл.Одно слово, одна строка.И это наш вывод: список слов, разделенных символом новой строки, хранится в файле.

Мы можем даже представить и написать функцию, которая будет читать слово из этого результата «по индексу».Как вам (кажется) нужно.

         // hint: there is a FILE * behind
         int words_count = result_size () ;
         const char * word = result_get_word(3) ;

Теперь я смело пошел вперед и написал «все», кроме этой последней «решающей» части.В конце концов, я уверен, что вы тоже хотели бы внести свой вклад.

Таким образом, рабочий код (за вычетом result_size) и result_get_word ()) здесь жив и работает: https://wandbox.org/permlink/uLpAplNl6A3fgVGw

Чтобы избежать«Гнев хана» я также вставил здесь:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*
 task: remove all non alpha chars from a given string, store the result
 */

 int process_and_save (FILE *, const char *) ;
 int dump_result(FILE *) ;

 int main( const int argc, const char * argv[] )
 {
   const char * filename = "words.txt";
   const char * to_parse = "0abra123ka456dabra789" ;

    (void)(&argc) ; (void)argv ; // pacify the compiler warnings 

     printf("\nInput: %s", to_parse ) ;
     int retval = process_and_save(fopen(filename, "w"), to_parse ) ;
     if ( EXIT_FAILURE != retval )
      {
    printf("\n\nOutput:\n") ;
    retval = dump_result(fopen(filename, "r"));
      }
    return retval ;
  }

  int process_and_save (FILE * fp, const char * input )
  {
    if(!fp) {
       perror("File opening failed");
         return EXIT_FAILURE;
     }
    // 
    char * walker = (char *)(input) ;
    while ( walker++ ) 
    {
         if ( ! *walker ) break ;
         if ( isalpha(*walker) ) {
            fprintf( fp, "%c", *walker ) ;
            // I am alpha but next one is not
            // so write word end, next
             if ( ! isalpha(*(walker +1) ) )
                   fprintf( fp, "\n" ) ;
          }
    }
    fclose(fp);
    return EXIT_SUCCESS; 
 }

 int dump_result(FILE* fp )
 {
  if(!fp) {
    perror("\nFile opening failed");
      return EXIT_FAILURE;
  }

   int c; while ((c = fgetc(fp)) != EOF) { putchar(c); }

   if (ferror(fp))
       puts("\nI/O error when reading");

       fclose(fp);
          return EXIT_SUCCESS;
  }

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

...