我的作业要求显示我的名字,使其如下所示:'姓氏,名字'。姓氏然后是[逗号空间]名字。虽然没有在该名称之后移动文本的其余部分。这是我的代码:
char str1[11];
char str2[3];
char str3[16];
strcpy (str1,fn);
strcpy (str2,", ");
strcpy (str3,ln);
strncat (str1, str2, 14);
strncat (str1, str3, 31);
我的老师说我做了他想做的事,但他不喜欢我用了多少行代码,并说我做的工作超出了我的需要。
变量:ln = last name
,fn = first name
我为','逗号空间创建了str2。
他希望我做什么?
答案 0 :(得分:5)
假设你知道字符串的长度,为什么不知道?
web-mode
答案 1 :(得分:4)
char result[50];
strcpy(result, ln);
strcat(result, ", ");
strcat(result, fn);
他是对的,你使用过多的陈述(浪费了太多的记忆)。
答案 2 :(得分:3)
这就是你所需要的:
strcpy (str1,ln); // Copy the last name to str1
strcat (str1,", "); // Now append ", " to the last name in str1
strcat (str1,fn); // Lastly, append the first name to str1
您必须确保str1
足够大以容纳所有这些内容。一个包含13个字符的数组可能还不够。
答案 3 :(得分:1)
由于您已在变量中使用了名字和姓氏,因此您的strcpy
调用确实是不必要的。您可以创建一个足以容纳整个字符串的缓冲区,然后使用strcat
创建最终的“lastname,firstname”字符串。
答案 4 :(得分:1)
我很惊讶你的导师接受了你的回答。您在char数组str1中累积结果,您声明的字符串只有11个字符。除非strlen(ln)+strlen(fn)<=8
,否则您将超出为结果str1
分配的空间。在过去的糟糕时期,C程序员只需简单地分配一个看起来足够大的结果数组,而不用担心检查。 sprintf
中的标准C库函数stdio.h
专为此作业而设计:
#include <stdio.h>
...fn, ln defined...
char result[80]; /* 80 characters is probably enough */
sprintf(result, "%s, %s", ln, fn);
现代C程序员永远不会认为ln
和fn
足够短,不会溢出结果数组,无论多长时间。安全,现代的替代方案是用sprintf
替换snprintf
来电:
snprintf(result, 80, "%s, %s", ln, fn);
您还可以使用strcpy
中的strcat
/ string.h
系列函数。 (这是在您的作业中指定的吗?)安全,现代的等价物是strncpy
和strncat
,它们允许您指定要复制的最大字符数。使用这些功能的快速而肮脏但安全的解决方案是:
char result[80];
result[0] = '\0'; /* initialize result to "" */
strncat(result, ln, 40);
strcat(result, ", ") /* you know this adds exactly two characters */
strncat(result, fn, 38);
strncpy
调用很危险,因为它可能不会在result
中留下以空字符结尾的字符串,这会导致后续strcat
失败。这并不比你做的少很少,但只使用这些string.h
函数,做得好得多并且保证你不会溢出结果缓冲区,无论如何提供了ln
和fn
。