[问题] 用memcpy 会有残余值怎么办?

楼主: apologize (人生在世很惬意)   2016-02-02 10:06:36
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
dev C++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
string.h
问题(Question):
我用 memcpy (Ptr->ListString, CharPtr, Length);
去喂资料,然后用link list 去存值,在只有两个字符时,会多了残余值。
喂入的资料(Input):
char StringOriginalData[100] = "Abian is son of the bitch";
预期的正确结果(Expected Output):
Abian 5
is 2
son 3
of 2
the 3
bitch 5
请按任意键继续 . . .
错误结果(Wrong Output):
Abian 5
iss 2
son 3
ofs 2
the 3
bitch 5
请按任意键继续 . . .
程式码(Code):(请善用置底文网页, 记得排版)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char StringOriginalData[100] = "Abian is son of the bitch";
char StringChange[10] = "are";
typedef struct _VOCABULARY_LIST {
char *ListString;
struct _VOCABULARY_LIST *Node;
}VOCABULARY_LIST;
void TearOffAndAdd (VOCABULARY_LIST *Ptr);
int main (int argc, char *argv[]) {
VOCABULARY_LIST *FirstVocabulary;
VOCABULARY_LIST *PtrVocabulary;
FirstVocabulary = (VOCABULARY_LIST *)malloc (sizeof (VOCABULARY_LIST));
PtrVocabulary = FirstVocabulary;
PtrVocabulary->Node = NULL;
TearOffAndAdd (PtrVocabulary);
system("PAUSE");
return 0;
}
void TearOffAndAdd (VOCABULARY_LIST *Ptr) {
char *CharPtr;
VOCABULARY_LIST *NewList;
int Length;
CharPtr = StringOriginalData;
Length = strcspn (CharPtr, " ");
while (Length != 0) {
Ptr->ListString = (char *)malloc (Length * sizeof(char));
memcpy (Ptr->ListString, CharPtr, Length);
printf ("%s", Ptr->ListString);
printf (" %d\n",Length);
NewList = malloc (sizeof (VOCABULARY_LIST));
NewList->Node = NULL;
Ptr->Node = NewList;
Ptr = NewList;
CharPtr += (Length + 1);
Length = strcspn (CharPtr, " ");
}
}
补充说明(Supplement):
这到底怎么回事?
作者: ncoomb (伦)   2016-02-02 11:08:00
is 2(四个字符);iss 2(五个字符;
作者: hichcock (快乐一整年 ^^~~~)   2016-02-02 11:43:00
有一种东西叫 "结束字符"
作者: remuswu1019 (remus)   2016-02-02 11:55:00
我用你提供的程式码编译,执行结果正常耶!
楼主: apologize (人生在世很惬意)   2016-02-02 12:48:00
要加这种东西喔 \0
作者: ncoomb (伦)   2016-02-02 14:22:00
我只是觉得跟len有关,不是残值。怎不用strtok? 作业吗?
作者: overhead (overhead)   2016-02-03 00:27:00
memcpy只是如实的复制memory里的值喔 不会帮你生出\0另一方面%s是看\0决定结束在哪 你没有给\0它不知道到哪结束你可以找memcpy strcpy strncpy的code比较差异
作者: uranusjr (←這人是超級笨蛋)   2016-02-03 09:50:00
为什么要在这里用 strcat...
楼主: apologize (人生在世很惬意)   2016-02-03 09:55:00
不小心多写出来了 =
作者: ncoomb (伦)   2016-02-03 10:12:00
恭喜啦。假设如果要效能好点的linklist,应减少使用memory的函式。你觉得如何做呢?
作者: justinj (黑旋风)   2016-02-03 13:26:00
除非要copy的东东是binary,结构之类才会去用memcpy
楼主: apologize (人生在世很惬意)   2016-02-03 14:17:00
有差喔,我还以为没差耶
作者: justinj (黑旋风)   2016-02-03 16:57:00
如果你要没差..copy的长度=strlen()+1...这不是更烦啊...如果要部分的话是没什么差..
作者: LPH66 (-6.2598534e+18f)   2016-02-03 18:57:00
memcpy 丢 strlen()+1 是做两次功...

Links booklink

Contact Us: admin [ a t ] ucptt.com