【发布时间】:2011-09-10 00:10:59
【问题描述】:
我创建了一个将数字转换为罗马数字的函数。我知道转换本身的逻辑是正确的,但是,每次调用 strncpy 时,它都会覆盖“rom”的先前值。我什至尝试背靠背调用它,但它只返回了后者。
这是代码中的一个 sn-p:
char* rom = (char*) calloc (10,sizeof(char));
while(intval>=1000){
intval -= 1000;
strncpy(rom,"M",2);
}
也许使用 calloc 是问题的一部分,但我尝试使用 malloc 并且它给了我相同的结果。
【问题讨论】:
-
您可以在您的问题中发布代码,这是首选,这样如果外部网站出现故障,链接不会中断,问题也不会变得无用。
-
两个挑剔。首先 -
sizeof(char)是1,为什么还要写出所有这些?第二 - 不要从calloc()转换返回值 - 它可以隐藏#include错误,这些错误会作为链接器错误回来咬你。 -
strncpy 正在做 strncpy 所做的事情。在您的情况下,由于您的所有源值都是文字,并且您正在指定文字的长度,包括空终止符,因此它完全符合 strcpy 的作用。
-
请注意,您可以通过在每次分配
rom后增加它来解决问题。例如,strcpy(rom,"M"); rom += strlen("M");然后rom总是指向下一个存储位置,您可以使用便宜的 strcpy 与(稍微)更昂贵的 strcat。 (当然,您需要保留指向rom的原始开头的指针才能访问最终结果。)