Предупреждение об отладке: строка не завершена нулем.Есть идеи, что бы это могло быть? - PullRequest
0 голосов
/ 01 декабря 2011

Я объединяю несколько строк. При запуске программы она выдает сообщение об ошибке отладки. сообщение, которое говорит выражение: (L "Строка не завершена нулем" && 0).

Кажется, что все строки заканчиваются на NULL, но я не уверен, что еще это может быть. Есть идеи?

Я включаю отрывок кода, где он вызывает проблему.

void foo(){
    ....
    char adj_command_string[COMMAND_SIZE];
    reconstructCommand(&command_parameters, adj_command_string);
    ....
}


void reconstructCommand(command* command_data, char* adjusted_string){

    char partial_string[COMMAND_SIZE];
    char string_rep[COMMAND_SIZE];

    if (command_data->g_code.new_value){
        sprintf_s(string_rep, COMMAND_SIZE, "G%d ", command_data->g_code.value);
        strcat_s(partial_string, COMMAND_SIZE, string_rep);
    }

    // If position changed, include change in command.
    if (command_data->pos.X.value){
        sprintf_s(string_rep, COMMAND_SIZE, "X%.4f ", command_data->pos.X.value);
        strcat_s(partial_string, COMMAND_SIZE, string_rep);
    }

    if (command_data->pos.Y.value){
        sprintf_s(string_rep, COMMAND_SIZE, "Y%.4f ", command_data->pos.Y.value);
        strcat_s(partial_string, COMMAND_SIZE, string_rep);
    }

    if (command_data->pos.Z.value){
        sprintf_s(string_rep, COMMAND_SIZE, "Z%.4f ", command_data->pos.Z.value);
        strcat_s(partial_string, COMMAND_SIZE, string_rep);
    }

    if (command_data->pos.A.value){
        sprintf_s(string_rep, COMMAND_SIZE, "A%.4f ", command_data->pos.A.value);
        strcat_s(partial_string, COMMAND_SIZE, string_rep);
    }

    // If Feedrate originally included, include it in modified command
    if (command_data->feedrate.new_value){
        sprintf_s(string_rep, COMMAND_SIZE, "F%.4f ", command_data->feedrate.value);
        strcat_s(partial_string, COMMAND_SIZE, string_rep);
    }

    // If spindle speed originally included, include it in modified command
    if (command_data->speed.new_value){
        sprintf_s(string_rep, COMMAND_SIZE, "S%.4f ", command_data->speed.value);
        strcat_s(partial_string, COMMAND_SIZE, string_rep);
    }

    adjusted_string = partial_string;
}

Ответы [ 4 ]

2 голосов
/ 01 декабря 2011

Вы пытаетесь поместить в строку больше символов, чем позволяет COMMAND_SIZE, не оставляя места для завершающего нуля. COMMAND_SIZE должно быть как минимум на единицу больше, чем максимальная длина, которую может получить строка, иначе не будет места для завершения строки.

Также:

adjusted_string = partial_string;

Это не делает то, что вы думаете, что делает. Он изменяет значение adjusted_string, указывая на partial_string, но затем отбрасывает это значение, возвращая. Вы, вероятно, хотите, чтобы strcpy_s позвонил, чтобы скопировать результат.

1 голос
/ 01 декабря 2011

Не похоже, что инициализируется partial_string, что должно быть до использования его в качестве цели для strcat_s.

Нечто подобное должно предшествовать выражению if:

partial_string[0] = '\0';
1 голос
/ 01 декабря 2011

Я не уверен, является ли это источником проблемы, но:

adjusted_string = partial_string;

Не копирует содержимое partial_string в adjusted_string. Используйте strcpy() или другой подобный механизм и убедитесь, что adjusted_string имеет нулевое значение.

0 голосов
/ 01 декабря 2011

дальше к @Schwartz: чтобы всегда иметь нулевое окончание ...

char partial_string[COMMAND_SIZE+1];
partial_string[COMMAND_SIZE] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...