我很惊讶你的教练接受了你的答案。你将结果累积在字符数组str1中,而你声明它只有11个字符。除非strlen(ln)+strlen(fn)<=8,否则你会溢出为结果分配的空间str1。在过去不好的日子里,C程序员会简单地分配一个似乎足够大的结果数组,并且不费心检查。标准的C库函数sprintf在stdio.h中专门用于此任务。
#include <stdio.h>
...fn, ln defined...
char result[80];
sprintf(result, "%s, %s", ln, fn);
现代C程序员永远不会假设
ln
和
fn
的长度足够短,不会导致结果数组溢出。安全、现代的替代方法将
sprintf
调用替换为
snprintf
。
snprintf(result, 80, "%s, %s", ln, fn);
你还可以使用
string.h
中的
strcpy
/
strcat
函数族。这在你的任务要求中有明确说明吗?现代安全的等效函数是
strncpy
和
strncat
,它们允许你指定要复制的最大字符数。使用这些函数的一种快速而安全的解决方案是:
char result[80];
result[0] = '\0';
strncat(result, ln, 40);
strcat(result, ", ")
strncat(result, fn, 38);
< p >
strncpy
调用是危险的,因为它可能不会在
result
中留下以 null 结尾的字符串,这将导致后续的
strcat
失败。虽然这比您所做的代码行数少得多,但仅使用这些
string.h
函数,要保证无论给定的
ln
和
fn
是什么,都无法溢出结果缓冲区,这很困难。 < / p >
strcpy
和strncat
,那么可以了解一下sprintf
! - tonysdgstrcat(str1, ", ");
。或者,你可以使用sprintf。 - Bobby Sacamano