Случайные символы появляются в строке? - PullRequest
0 голосов
/ 09 декабря 2011

Я пытаюсь нормализовать строку C, содержащую число, чтобы в начале добавлялись дополнительные нули, чтобы вся строка содержала символы MAXCOL (а это 8 ..)

Кажется, все работает нормальновплоть до того момента, когда я добавляю исходную строку обратно в нормализованную строку: добавляются некоторые случайные символы, аналогично тому, как я добавляю символы, которые идут после символа \0, что делает строку странной при отображении на экране.

Я надеюсь, что кто-то знает, что я делаю неправильно.

Чтобы дать вам представление, t_operande2D - это двумерный массив символов [MAXCOL]

void normaliser_operandes(t_operande2D mes_operandes){
    // This procedure adds zeros to the beginning of each mes_operandes to have a normalized nbr of MAXCOL chars
    // 
    // Lets say it receives mes_operandes[0] as 10, it will convert it to 00000010

    int j, nombre_caracteres; // Nbr of original caracters
    t_operande2D operandes_normalises; // The normalized output (temp variable)

    for(int i=0; i<MAXLIGNE; i++){
        // Count the original nbr of chars
        nombre_caracteres = 0;
        for(int j=0; (j<MAXCOL && mes_operandes[i][j]!='\0'); j++){
            nombre_caracteres++;
        }
        // Add needed 0s to the beginning
        for(j=0; j< MAXCOL - nombre_caracteres; j++){
            operandes_normalises[i][j] = '0';
        }
        operandes_normalises[i][j] = '\0';

    strncat(operandes_normalises[i], mes_operandes[i], nombre_caracteres);

    strncpy(mes_operandes[i], operandes_normalises[i], MAXCOL);
    }
}

РЕДАКТИРОВАТЬ: после редактирования strncat выдаёт мне ошибку «стек вокруг operandes_normalises был поврежден ...»: (

1 Ответ

4 голосов
/ 09 декабря 2011

strcat ожидает, что оба аргумента завершены NUL. Судя по всему, operandes_normalises[i] начинается с MAXCOL - nombre_caracteres количества '0' char с, но за ним не следует терминатор NUL ('\0') для указания конца строки.

strcat будет искать конец строки перед добавлением mes_operandes[i] к operandes_normalises[i]. Если символы барахла находятся между '0' и mes_operandes[i], то это ваша проблема - в operandes_normalises[i] отсутствует терминатор.

Если ненужные символы идут после mes_operandes[i], то mes_operandes[i] - это символ, который не заканчивается NUL.

Распечатайте operandes_normalises[i] после добавления '0' в начало строки, чтобы увидеть, так ли это. Судя по всему, я думаю, что есть хороший шанс.

т. Если MAXCOL - nombre_caracteres равно 5, operandes_normalises[i] может быть:

"00000random_garble\0" /* just so happens to be a '\0' somewhere in memory */

Поэтому mes_operandes[i] будет добавлено после ненужных символов.

РЕДАКТИРОВАТЬ: Как я мог бы добавить, strcat небезопасно, особенно в том, как он используется здесь - нет проверки, чтобы убедиться, что mes_operandes[i] вписывается в operandes_normalises[i].

Попробуйте использовать strncat, однако обратите внимание, что он записывает n + 1 символов в место назначения. Из справочных страниц:

Если src содержит n или более символов, strncat () записывает n + 1 символов в dest (n из src плюс завершающий нулевой байт). Следовательно, размер dest должен быть как минимум strlen (dest) + n + 1.

...