Не удается добавить указанный символ c в начале символа *, он позволяет добавить его только после C? - PullRequest
1 голос
/ 26 апреля 2020

У меня проблемы с добавлением «-» в начало строки в C, так как это вызывает ошибку сегмента. Кажется, нет проблем с добавлением «-» в конец строки. По сути, в структуре есть два поля, и если одно из полей имеет значение «-1», это значение должно быть отрицательным, а «-1» должно быть добавлено к другому полю в структуре. Добавление 'ch' в начало приводит к тому, что он начинает работать с ошибкой.

Вот код:

        unsigned int toPrint = size(unitLiterals);
    qsort(unitLiterals->element, toPrint, sizeof(Literal*), sort);
    for (unsigned int i = 0; i < toPrint; i++){
        Literal*literal = get(unitLiterals, i);
        if (literal->isNegative == 1){
            printf("%s", literal->name);

        }
        else {
            char *ch = "-";
            strcat((char*)literal->name, ch);
            printf("%s", literal->name);
        }
        if (i != toPrint-1){
            printf(" ");
        }
        else {
            printf("\n");
        }
    }

Инициализация структуры:

Literal *newLiteralStruct (char *name, int i){
    Literal *this = malloc(sizeof(Literal));
    this->name = name;
    this->isNegative = i; 
    return this;
}

Литерал в заголовочном файле:

typedef struct Literal Literal;

struct Literal {
    char* name;
    int isNegative;
};

1 Ответ

2 голосов
/ 26 апреля 2020

Я бы хотел, чтобы ch был добавлен в начале, а не в конце, и я не знаю, как это исправить.

Не использовать strcat за это. strcat всегда добавляет копию строки, на которую указывает второй аргумент, к концу строки, на которую указывает первый аргумент, а не к его началу.

Вместо этого можно использовать буфер и последовательность вызовов для strcpy:

 char *ch = '-';                          // Note the `-` is a character, not a string.
 char buf[N];                   
 buf[0] = *ch;                            // Copy `-` to the first element of `buf`. 
 strcpy(&buf[1], literal->name);          // Copy the string in `name` to `buf`,
                                          // starting at the second element of `buf`.   
 strcpy(literal->name, buf);              // Copy the string in `buf` back to `name`.
 printf("%s", literal->name);

Обратите внимание, что name должен иметь дополнительный элемент, содержащий добавленный символ - и Конечно, элемент для хранения завершающего нулевого символа. Также буфер должен быть способен содержать строку в name плюс добавленный - и нулевой символ.

Вы также можете опустить ch, так как он не нужен и немного кодировать более компактный:

 char buf[N];
 buf[0] = '-';
 strcpy(&buf[1], literal->name);
 strcpy(literal->name, buf);
 printf("%s", literal->name);

Или вы можете отсортировать каждый символ строки по name на один элемент вперед (включая нулевой символ) и затем присвоить '-' первому элементу name:

size_t len = strlen(literal->name);
for ( size_t i = 0; i < (len + 1); i++ )
{
    literal.name[i+1] = literal.name[i];
}
literal.name[0] = '-'; 

Но, опять же, здесь name требует способности содержать строку + '-' + нулевой символ.

...