2015-03-02 1 views
0

Моя проблема также может привести к остановке переполнения буфера;Мне нужна помощь в том, как получить строку меньшего размера из более крупной строки? в 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».

БЛАГОДАРЯ

+0

Конечно, 'char b [40]; ... b [40] = '\ 0'' не работает, так как 'b [40]' находится за пределами диапазона 'char b [40]'. Все после этого не имеет значения. – chux

+0

'sprintf (first, b, gol, gift, minutes, secs);' обязательно печатает за пределами диапазона 'first'. – chux

+0

в принципе я не мог сделать b [39] = '\ 0', потому что он принимал бы часть строки. Но в любом случае я изменил свой код, так что мне больше не нужен ответ. Uu может поправить ваш комментарий в ответ – user2977715

ответ

0

, что я обнаружил, что с помощью "б [40] = '\ 0'" дает правильный ответ. Но если вы используете его для циклов, вам нужно отслеживать, когда вы нажмете нулевой «\ 0», чтобы сломать. что означало бы, что вы достигли конца. Я не понимал, что у меня есть рабочий ответ, пока на следующий день.

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

Смежные вопросы