Моя проблема также может привести к остановке переполнения буфера;Мне нужна помощь в том, как получить строку меньшего размера из более крупной строки? в C
первой стратегия
char first[40];
char g[] = " Level %d %d Fruit %d:%d ";
char d[41] = {0};
strncpy(d, g, 40);
if(strlen(d) < 40) {
for(i = strlen(d); i < 40; i++) {
d[i] = ' ';
}
}
n = sprintf(first, d, gol, gift, minutes, secs);
I Печать моего п на экран игры, я получаю мой текст и некоторые неизвестные символы следующих, а это значит, есть переполнение буфера где-то.
2-я стратегия;
char first[40];
char b[40];
strncpy(b, g, sizeof(b));
fgets(b, 40, stdin); // of b[40] = '\0' also fails
n = sprintf(first, b, gol, gift, minutes, secs);
с использованием «Ъ [40] =„\ 0“», я распечатать мой п на экране игры, я получаю мой текст и некоторые неизвестные символы следующие, а это значит, есть переполнение буфера где-то. использование «fgets» сразу же приводит к сбою игры, даже если g на данный момент составляет 40 символов, но я хочу увеличить его позже.
Для обеих стратегий Если я на самом деле просто положил «g» в оператор «sprintf», он делает то, что я хочу, за исключением случаев, когда я увеличиваю его до более чем 40 символов. Извините, что я не могу опубликовать весь код игры, потому что его 4000 строк долго разделены на 10 файлов.
I wold ценит совершенно другой способ получить строку из 40 символов из строки большего количества символов, не оставляя мусора. Строку нужно вводить вручную в код, а не вводить от пользователя, ее не нужно объявлять, как я объявил «g».
БЛАГОДАРЯ
Конечно, 'char b [40]; ... b [40] = '\ 0'' не работает, так как 'b [40]' находится за пределами диапазона 'char b [40]'. Все после этого не имеет значения. – chux
'sprintf (first, b, gol, gift, minutes, secs);' обязательно печатает за пределами диапазона 'first'. – chux
в принципе я не мог сделать b [39] = '\ 0', потому что он принимал бы часть строки. Но в любом случае я изменил свой код, так что мне больше не нужен ответ. Uu может поправить ваш комментарий в ответ – user2977715