Остановите конкатенацию строки в динамический массив, когда '#' введен пользователем в C - PullRequest
1 голос
/ 27 мая 2019

Мне необходимо написать код, в котором я постоянно читаю вводимые пользователем строки и сохраняю их в одной и той же переменной. Каждый раз, когда ввод получен, строка будет объединена в динамический массив (таким образом, динамический массив становится все больше и больше). Он прекратит чтение ввода от пользователя, когда ввод содержит «#».

Ожидаемые входы и выходы должны быть:

inputs              output
here I am #abc      hereIam
there you are #12   thereyouare

Вот код, который я сделал:

#include<stdio.h>
#include<stdlib.h> // for malloc
#include<string.h> // for string funs

int main(void){
    char input1[256];
    char *combined = malloc(sizeof(char));
    int i = 0;

    while (input1[i]!= '#'){  
    // read in the arrays
    printf("Enter a string (max 256 char) ");
    scanf("%256s",input1);

    // find out string lengths
    int len1;
    len1=strlen(input1);

     // allocate an array big enough for both
     combined=realloc(combined, sizeof(char)*(len1));

     //concatenate
     strcat(combined,input1);
    }


    // print
    printf("%s\n",combined);

    return 0;
}

У этого кода есть несколько проблем:

  1. Я понятия не имею, как проверить, являются ли элементы, отличные от первого элемента ввода пользователя, '#' или нет.
  2. Даже если вход содержит «#», выход будет по-прежнему содержать этот вход, где находится «#».

Может кто-нибудь дать мне подсказку, как решить эту проблему? Спасибо!

1 Ответ

1 голос
/ 27 мая 2019

Вы можете усложнить себе, что должно быть.В то время как ваш заголовок вывода с двумя столбцами добавляет немного сложностей с форматированием, самый простой способ обработки ввода и классификации (store-it / ignore-it) - это символьно-ориентированный подход с использованием getchar()или fgetc().

Таким образом, вы просто постоянно читаете из ввода и проверяете, является ли символ '#' или '\n', если это так, прекращаете хранить символы в вашем буфере и просто читаете и выводите остальные.После завершения вашего цикла вам просто нужно nul-terminate ваш последний буфер, вычислить пробел, необходимый между концом оригинала и выводом содержимого вашего буфера, записать пробелы и последний буфер, и высделанный.Краткий пример:

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

#define MAXC 1024   /* if you need a constant, #define one (or more) */

int main (int argc, char **argv) {

    char buf[MAXC];
    int c, idx = 0, nc = 0, ws = 0;
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    puts ("inputs              output");    /* output headings */
    while ((c = fgetc(fp)) != EOF) {        /* read each char until EOF */
        if (c == '#' || c == '\n') {        /* if # or \n, end of storage */
            buf[idx] = 0;                   /* nul-terminate buffer at idx */
            putchar (c);                    /* output delim in orig string */
            nc++;                           /* increment no. of char  */
            while ((c = fgetc(fp)) != '\n' && c != EOF) {   /* print rest */
                putchar (c);
                nc++;
            }
            ws = 20 - nc;           /* compute amount of whitespace to col */
            while (ws--)            /* output that many spaces */
                putchar (' ');
            printf ("%s\n", buf);   /* print the stored buffer */
            idx = 0, nc = 0;        /* reset index and counter */
            continue;               /* go get next char */
        }
        else if (isalnum (c))       /* if alnum char add to buffer */
            buf[idx++] = c;
        putchar (c);        /* output all chars until # */
        nc++;               /* increment no. of chars */
    }
    buf[idx] = 0;           /* nul-terminate final line after loop */
    ws = 20 - nc;           /* set number of whitespace needed to 2nd col */
    while (ws--)            /* write that number of spaces */
        putchar (' ');
    printf ("%s\n", buf);   /* output string without whitespace in buf */

    if (fp != stdin)        /* close file if not reading stdin */
        fclose (fp);

    return 0;
}

Пример входного файла

$ cat dat/pounddelim.txt
here I am #abc
there you are #12

Пример использования / Вывод

Выполнениепрограмма на вашем входе выдает «Ожидаемые входы и выходы» :

$ ./bin/pounddelim <dat/pounddelim.txt
inputs              output
here I am #abc      hereIam
there you are #12   thereyouare

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

...