Конкатенация строк в C - PullRequest
0 голосов
/ 04 декабря 2010

Итак, я получил эту функцию, которая может поставить пробел перед знаком "/" C, если пробела нет.И это прекрасно обрезает строку, но я получаю ошибку, возможно, нарушение памяти, когда я пытаюсь объединить строку вместе.Пожалуйста, дайте мне руку.

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

char* substr(const char *pstr, int start, int numchars) {
    char* pnew = malloc(numchars + 1);
    strncpy(pnew, pstr + start, numchars);
    pnew[numchars] = '\0';
    return pnew;
}

char* fixString(char str[]) {
    char* position;
    char* newString = "";
    char* finalString;

    int oldPosition = 0;
    printf("Original str: %s\n", str);
    printf("Original length: %d\n\n", strlen(str));

    position = strchr(str, '/');
    while (position != NULL) {
        int charPosition = position - str;

        printf("String position: %d->%d\n", oldPosition, charPosition);
        newString = substr(str, oldPosition, charPosition - oldPosition);
        oldPosition = charPosition;
        if (charPosition > 0 && str[charPosition - 1] != ' ') {
            printf("Previous char: %c\n", str[charPosition - 1]);
            newString = strcat(newString, " ");
        }

        printf("String: |%s|\n", newString);
        if (strlen(newString) > 0) {
            finalString[0] = strcat(finalString, newString);
        }
        printf("------------\n");
        position = strchr(position + 1, '/');
    }
    char* lastString = substr(str, oldPosition, strlen(str));
    finalString = strcat(finalString, lastString);
    printf("lastString: %s\n\n", lastString);
    return finalString;
}

int main() {
    char* testString = "/Filter /FlateDecode/Length 7108/Subtype /Type1C";
    printf("%s", fixString(testString));

    return 0;
}

Ответы [ 4 ]

2 голосов
/ 04 декабря 2010

Вы никогда не выделяете целевой буфер.Переменная finalString ни к чему не инициализируется.

Это не единственная проблема с вашим кодом.Кажется, вы воспринимаете char * как некий умный тип строки, но это не более чем указатель на область памяти.Например, это:

newString = strcat(newString, " ");

не объединяет две строки и не возвращает объединенный результат.Он добавляет пробел в буфер символов, на который указывает newString, и возвращает тот же буфер.Назначение newString безвредно, но вводит в заблуждение.

// It is the callers responsibility to free the returned string.
char *fixString(char *str) {
    int len;
    char *s;
    char *dest;
    int after_space;

    // First pass, figure out the size of the output.
    len = 0;
    after_space = 0;
    for (s = str; *s; s++) {
        len += 1 + (!after_space && *s == '/');
        after_space = *s == ' ';
    }
    dest = malloc(len + 1);

    s = dest;
    after_space = 0;
    while(*str) {
        if (!after_space && *str == '/') *s++ = ' ';
        after_space = (*s++ = *str++) == ' ';
    }
    return dest;
}
0 голосов
/ 04 декабря 2010

Возможно, вам придется проверить размер после malloc () и realloc (), если это необходимо.Добро пожаловать в прекрасный мир управления памятью в C:)

0 голосов
/ 04 декабря 2010

Вы никогда не malloc памяти для ваших newString и finalString указателей. strcat ожидает, что указатель назначения, который вы дадите, имеет достаточно места для хранения строк.

0 голосов
/ 04 декабря 2010

Вам нужно выделить немного памяти для finalString.

Попробуйте сделать это так:

#define BUFFER_SIZE 1024
char* finalString = malloc(BUFFER_SIZE);
// ...
strncat(finalString, "something", 1024);

Не забудьте вызвать free() на указателе, когда вам не нужноэто больше (не в вашей функции - после возврата функции, где-нибудь в клиентском коде, когда результат не нужен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...