2015-03-02 38 views
0

我的问题也可以转化为停止溢出缓冲区;我需要关于如何从较大的字符串中获取较小字符串的帮助?在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

+0

当然'char b [40]; ... b [40] ='\ 0''因为'b [40]'超出'char b [40]'的范围而失败。之后的一切都是无关紧要的。 – chux 2015-03-03 01:18:31

+0

'sprintf(第一,b,gol,礼物,分钟,秒);'肯定在第一个'范围之外打印。 – chux 2015-03-03 01:34:28

+0

基本上我不能做b [39] ='\ 0',因为它会占据字符串的一部分。但无论如何,我改变了我的代码,所以我不再需要一个答案。 Uu可能会将您的意见转换为答案 – user2977715 2015-03-03 02:14:46

回答

0

是我发现的是,使用 “B [40] = '\ 0'” 给你一个正确的答案。但是如果你在for循环中使用它,你必须跟踪你什么时候击中null'\ 0'来中断。这意味着你达到了最后。直到一天之后,我才意识到我有一个可行的答案。

无论如何,我的电讯管理局最终告诉我,我所做的比我所问的要多得多,即我从来不需要这样做。

相关问题