我的问题也可以转化为停止溢出缓冲区;我需要关于如何从较大的字符串中获取较小字符串的帮助?在C
月1日战略
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);
打印我ñ到游戏的画面,让我的文字和下面的一些未知的字符,这意味着有一个缓冲区溢出的地方。
第二种策略;
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);
使用“B [40] =‘\ 0’”,我打印我ñ到游戏的画面,让我的文字和下面的一些未知的字符,这意味着有一个缓冲区溢出的地方。使用“fgets”会立即崩溃游戏,即使g是40个字符,但我想稍后增加它
对于这两种策略,如果我实际上只是在“sprintf”语句中放入“g”除了当我将它增加到40个以上的字符时,它就是我想要的。对不起,我不能发布整个游戏代码,因为它的4000行长度分成10个文件。
我会欣赏一种完全不同的方式,从字符串中只有40个字符的字符串,而不会离开垃圾。字符串必须手动输入到代码中,而不是从用户输入,它不必像我声明的“g”那样声明。
THANKS
当然'char b [40]; ... b [40] ='\ 0''因为'b [40]'超出'char b [40]'的范围而失败。之后的一切都是无关紧要的。 – chux 2015-03-03 01:18:31
'sprintf(第一,b,gol,礼物,分钟,秒);'肯定在第一个'范围之外打印。 – chux 2015-03-03 01:34:28
基本上我不能做b [39] ='\ 0',因为它会占据字符串的一部分。但无论如何,我改变了我的代码,所以我不再需要一个答案。 Uu可能会将您的意见转换为答案 – user2977715 2015-03-03 02:14:46