C - расширение содержимого строки - PullRequest
1 голос
/ 18 марта 2012

Я пишу функцию, которая расширяет строку str1 и сохраняет ее как str2.Под расширением я имею в виду, что если str1 имеет «ad», он должен храниться в str2 как «abcd».Я написал следующий код.Я получаю ошибку отладки, что стек вокруг переменной str1 поврежден.Может кто-нибудь, пожалуйста, укажите, что идет не так?Спасибо.

#include <stdio.h>

void expand(char s1[], char s2[]);

int main() {

    char s1[] = "Talha-z";
    char s2[] = "";

    expand(s1, s2);
    printf(s2);

}

void expand(char s1[], char s2[]) {
    int i = 0;
    int j= 0;
    int k, c_next;

    while ( s1[i] != '\0') {
        switch (s1[i]) { 
        case ('-') :  
            c_next = s1[i+1]; 
            for ( k = 1; k < c_next; k++) {
                s2[j] = s1[i] + k;
                j++;
            }
            break;
        }

        i++;
        j++;
    }
    s2[j] = '\0';
}

Ответы [ 4 ]

3 голосов
/ 18 марта 2012

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

Вам нужно будет использовать динамическое выделение для s2 (то есть с помощью malloc), но сначала вам нужно будет рассчитать, сколько памяти вам нужно.

1 голос
/ 18 марта 2012

Проблема в том, что когда вы инициализируете s2, вы предоставляете ему достаточно места для 1 символа (т. Е. Заканчивающегося нулем '\ 0').Таким образом, когда вы пишете в s2:

s2[j] = ...

, нет никаких гарантий относительно того, в какую память вы пишете.

Для динамического выделения памяти для s2 необходимо использовать malloc .Другими словами, вам нужно выяснить, какой объем памяти требуется (т. Е. Найти длину развернутой строки), а затем выделить s2 столько же памяти и, наконец, заполнить ее с помощью написанной вами процедуры.

1 голос
/ 18 марта 2012
char s2[] = "";

Это эквивалентно написанию

char s2[1] = { '\0' };

Он не может содержать более одного символа (или ни одного вообще, если требуется терминатор NUL).

0 голосов
/ 18 марта 2012

Строка s2 в настоящее время находится в стеке для локальных переменных для main () и выделяется только один байт для одного символа.Когда вы вызываете функцию, ей передаются адреса стека для s1 и s2.Код переписывает все, что находится рядом с s2 в стеке функции main ().Отсюда и ошибка.Пожалуйста, используйте динамическое распределение памяти, как уже было предложено г-ном Оли выше.

Надеюсь, мое объяснение поможет вам.

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