我需要有关如何从较大的字符串中获取较小的字符串的帮助?在 C

I need help on how to get a lower sized string from a bigger string? in 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 );

我将我的 n 打印到游戏屏幕上,我得到了我的文本和一些未知字符,这意味着某处存在缓冲区溢出。

第二种策略;

char first[40];
char b[40];
strncpy(b, g, sizeof(b));
fgets(b, 40, stdin);            // of b[40] = '[=11=]' also fails            
n = sprintf(first, b, gol, gift, minutes, secs );

使用“ b[40] = '\0' ”,我将我的 n 打印到游戏屏幕上,我得到了我的文本和一些未知字符,这意味着某处存在缓冲区溢出。使用“ fgets ”会立即使游戏崩溃,即使 g 现在是 40 个字符,但我想稍后再增加它

对于这两种策略,如果我实际上只是将 "g" 放在“ sprintf ”语句中,它会执行我想要的操作,除非我将其增加到超过 40 个字符。抱歉,我无法 post 整个游戏代码,因为它的 4000 行长分成 10 个文件。

我会欣赏一种完全不同的方式,即从一个包含更多字符的字符串中获取一个仅包含 40 个字符的字符串,而不会留下垃圾。该字符串必须手动输入代码,而不是用户输入,它不必像我声明的那样声明 "g".

谢谢

我发现使用“b[40] = '\0'”可以得到正确答案。但是,如果您在 for 循环中使用它,则必须跟踪何时击中空 '\0' 中断。这意味着你到达了终点。直到一天之后我才意识到我有一个有效的答案。

无论如何,我的助教最后告诉我,我做的比要求的要多得多,也就是说,我从来不需要这样做。