Застрял в добавлении символа в строку - PullRequest
0 голосов
/ 30 декабря 2018

Я написал некоторый код, который делает символ, который пользователь выбирает для удаления из строки, и теперь я хочу добавить символ в конце, который выберет пользователь.Это первый раз, когда я делаю что-то подобное, поэтому я действительно теряюсь в том, что нужно изменить / добавить.Я думаю, что мне нужно использовать strcpy, чтобы скопировать строку, которую пишет пользователь, а затем сделать новую строку, чтобы как-то добавить к первой строке, это часть, которую я потерял, потому что я хочу использовать тот же код и просто внести некоторые измененияпоэтому можно увидеть разницу между добавлением символа и удалением символа.

Ответы [ 2 ]

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

Очевидно, что вам трудно понять использование функций пользовательского ввода и общую логику вашей программы.Как вы думаете, что делает следующее:

    printf("Enter a sentence: \n");
    fgets(str, 100, stdin);
    if (fgets(str, 100, stdin) == NULL) {
        ...

Сколько предложений ожидается от пользователя?Вызов fgets дважды не является тем, что вы намереваетесь - достаточно одного раза (удалите тот, на котором вы не можете проверить возврат) Хотя дублирование вызова fgets было не тем, что вам нужно, использование fgets для пользователя-вход был правильным выбором.

(также примечание: не возвращает отрицательные значения в вашу оболочку, например, return -1;, вместо этого просто возвращает 1, чтобы указать состояние ошибки (илимакрос EXIT_FAILURE, представленный в stdlib.h, который, как ни странно, определяется как 1)

Пока мы говорим об определенных константах, избегайте использования магических чисел в вашем коде (например, в char str[100];, 100 - это магическое число ). Вместо этого:

#define MAXC 100    /* if you need a constant, #define one (or more) */
...
    char str[MAXC] = "";

Поскольку вы объявляете str как массив 100 символов, вы знаете,что вам не нужно запрашивать ввод символа для добавления, если у вас уже есть строка 99 chars плюс символ , заканчивающийся нулем . Поэтому вам нужно сохранить длину строки. Ваше использованиеstrcspn - это хороший способ обрезать триал '\n' с str, но вы уже сканируете вперед в str, чтобы найти '\n' и nul-terminate строку там -- и - strcspn возвращает количество символов начального сегмента str, которое не включает '\n' (т.е. он вернет длину, поэтому просто сохраните ее)

    str[(len = strcspn(str, "\n"))] = 0;    /* save len */

Остальная часть кода просто проверяет len < MAXC - 1, чтобы убедиться, что имеется достаточно места для добавления символа, изатем предложите и наберите getchar, добавьте новый символ в str[len] и затем nul-terminate str снова в len+1.Вы можете сделать что-то похожее на:

    if (len < MAXC - 1) {
        printf ("\nEnter character to add: ");
        if ((r = getchar()) != EOF) {
            str[len++] = r;
            str[len] = 0;
            printf ("This is the sentence: '%s' (len: %zu)\n", str, len);
        }
        else
            fputs ("(user canceled input.)\n", stderr);
    }
    else {
        fputs ("\nerror: insufficient space to add char.\n", stderr);
        return 1;
    }

( примечание: , увеличивая len при добавлении нового символа, вы сохраняете длину новой строки в len ипри необходимости он сохраняется для последующего использования.)

Если положить его в целом, вы получите что-то вроде следующего:

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

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

int main (void) {

    char str[MAXC] = "";
    size_t len;
    int r;

    printf("Enter a sentence: ");           /* no newline needed */
    if (fgets(str, MAXC, stdin) == NULL) {
        fputs ("fgets failed\n", stderr);   /* no need for fprintf */
        return 1;   /* do not return negative values to your shell */
    }

    str[(len = strcspn(str, "\n"))] = 0;    /* save len */
    printf ("This is the sentence: '%s' (len: %zu)\n", str, len);

    if (len < MAXC - 1) {
        printf ("\nEnter character to add: ");
        if ((r = getchar()) != EOF) {
            str[len++] = r;
            str[len] = 0;
            printf ("This is the sentence: '%s' (len: %zu)\n", str, len);
        }
        else
            fputs ("(user canceled input.)\n", stderr);
    }
    else {
        fputs ("\nerror: insufficient space to add char.\n", stderr);
        return 1;
    }
}

(просто примечание, если вы не предоставляете конвертацию в течениеВаша строка формата вывода, например, %s или %d и т. д., тогда нет необходимости вызывать printf или fprintf. Вы можете просто вызвать puts или fputs, чтобы вывести буквальную строку.Хороший компилятор сделает эту оптимизацию для вас.)

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

$ ./bin/straddchr
Enter a sentence: 123456
This is the sentence: '123456' (len: 6)

Enter character to add: 7
This is the sentence: '1234567' (len: 7)

(и если вы изначально вводите 99 строку символов, выне будет предложено ввести дополнительный символ, и отобразится сообщение об ошибке "insufficient space to add char.")

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

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

Добавляет символ в строку C.

динамический - 1, если требуется перераспределение.0, если str был статически или динамически распределен и имеет достаточно места для размещения нового символа.

char *appendchar(char *str, int ch, int dynamic)
{
    char *tmp;

    if(dynamic)
    {
        tmp = realloc(str, strlen(str) + 2);
        str = tmp;
    }
    if(str)
    {
        size_t len = strlen(str);
        str[len] = ch;
        str[len + 1] = 0;
    }
    return str;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...