Чтение строки char за char из массива ассоциативных указателей - PullRequest
0 голосов
/ 20 января 2019

решаемые

Я создаю новый char *ch malloc(strlen) и зацикливаю эту строку char на char. Затем я копирую его обратно, используя memcpy(ch, &stringpool[index], len) Конечно, потом free(ch).


Надеюсь, заголовок моего вопроса правильный.

У меня есть струнный пул

char **string_pool;

, который инициируется в функции, подобной

string_pool = malloc( sizeof(char *) * 1024);

я получаю строки из stdin и сканирую их в массив

scanf("%[^\n]s", &string_pool[index]);

чтобы я мог распечатать его с помощью printf

printf("gets %s\n", &string_pool[index]);

как я могу

  • получить длину string_pool [индекс]
  • чтение string_pool [index] char по символу в цикле

Спасибо

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

Может быть, я должен объяснить это немного больше, это виртуальная машина с виртуальным набором команд и программа типа

push 1
read
gets

следует:

  • нажмите 1 в стеке -> пусть x будет 1
  • читать stdin как строку в string_pool [x]
  • поместить все символы в стек

функции выглядят как

    case GETS: {
        int index = popv(); // index is already on top of the stack
        int strl = strlen(&string_pool[index]);

        printf("gets %s with a length of %d\n", &string_pool[index], strl);
        // pseudo code
        // push each char as integer on the stack
        foreach(char in string_pool[index]) push((int)char);

        break;
    }

    case READ: {  
        int index = popv();          
        scanf("%[^\n]s", &string_pool[index]);
        break;
    }

    case WRITE: {  
        int index = popv();          
        printf("%s", &string_pool[index]);
        break;
    }

Моя проблема в случае GETS. Я хочу поместить каждый символ как int в стек.

Ответы [ 2 ]

0 голосов
/ 20 января 2019
char **string_pool;
string_pool = malloc( sizeof(char *) * 1024);

Выделяет 1024 указателей на символ .(string_pool является указатель на указатель на символ ) Каждый из указателей неинициализирован и указывает на недопустимое хранилище, которое можно использовать.Прежде чем вы сможете использовать каждый указатель, вы должны настроить его на указание на действительную память, выделив память и назначив начальный адрес каждому указателю (чтобы каждый указатель «указывал» на действительную память).

Чтобы разрешить правильное определение размера иДля каждой строки, которую вы читаете, вы либо будете использовать fgets с фиксированным буфером, достаточным для хранения самого длинного ввода, который вы ожидаете, либо вы можете использовать POSIX getline, который будет выделять память для ввода по мере необходимости.Используя fgets, вы делаете что-то похожее на:

#define MAXCHR 2048
...

char buffer[MAXCHR];

fputs ("enter string: ", stdout);
if (fgets (buffer, MAXCHR, stdin) == NULL) {
    fputs ("(user canceled input.)\n", stderr);
    return 1;
}

size_t len = strlen (buffer);   /* get the length of input (with '\n') */
if (len && buffer[len - 1] == '\n')    /* trim the '\n' from end */
    buffer[--len] = 0;          /* by overwriting with nul-character */


string_pool[index] = malloc (len + 1);      /* allocate storage for buffer */
if (string_pool[index] == NULL) {           /* validate allocation */
    perror ("maklloc-string_pool[index]");  /* handle error */
    return 1;  /* or break read loop; */
}
/* copy buffer to string_pool[index], advance index */
memcpy (string_pool[index++], buffer, len + 1); 

Обычно вы делаете это в цикле чтения, позволяя вводить только тогда, когда index < 1024 гарантирует, что вы не пытались выделить память для одного указателя слишком много.

Посмотрите вещи и дайте мне знать, если у вас есть вопросы.

0 голосов
/ 20 января 2019

Вы должны выделить место для каждой строки. Так, например,

string_pool[0] = malloc( 100 );

затем позволит вам прочитать строку длиной до 99 символов в string_pool [0] (для завершающего нуля требуется дополнительный пробел).

...