C - 使用strncpy()函数后的随机字符

Mat*_*hew 2 c null integer termination

我在C中有以下程序:

该程序的主要问题是,在执行复制操作后,复制的字母后会显示许多垃圾字符.我知道这是因为目标变量没有正确地以null结尾.但是,如果仔细检查代码,我将执行空终止.为什么问题仍然存在?

unw*_*ind 8

所以,呃,您认为如何strlen()计算字符串的长度?你认为需要终止吗?

提示:确实如此.字符数组不是C中的字符串,除非它以0字符终止.所有strlen()这一切都是计算字符数,直到找到终结符,因此在逻辑中使用它来终止缓冲区以使其成为字符串是鸡蛋类的情况.

你的问题是你误用了strncpy().这是一个非常容易做错的事情,因为从典型的(初学者)C程序员的角度来看,这个功能稍微有点疯狂.从名称来看,它根本没有做到你所期望的那样.

您可能只需手动执行此操作,只要您确定nob < sizeof destination - 1:

memcpy(destination, source, nob);
destination[nob] = '\0';
Run Code Online (Sandbox Code Playgroud)


Flo*_*ciu 5

代替:

destination[strlen(destination)] = '\0';
Run Code Online (Sandbox Code Playgroud)

有:

destination[nob] = '\0';
Run Code Online (Sandbox Code Playgroud)

strlen继续阅读,直到找到'\0'字符。


Wil*_*ris 5

马修,当你已经知道要复制的字符串的长度时,你不需要strcpystrncpy(检查每个字符在末尾查找\ 0).相反,您应该使用memcpy然后终止新字符串:

memcpy(destination, source, nob);
destination[nob] = '\0';
Run Code Online (Sandbox Code Playgroud)

memcpy 不检查'\ 0'因此更快.