我有一个工作的C程序,其中字符串数组的长度在编译时已知。它是:C程序:匹配字符串数组,当编译时已知长度与未知字节长度
(gdb) p array_person_name[0]
$1 = "John Smith", '\000' <repeats 26 times>, "\003\000\t\000p\005\240 ?", '\000' <repeats 11 times>, "@\337\377\377\377\177\000\000\260\337\377\377\377\177\000\000\001\000\000\000\000\000\000\000\300\332\377\377\377\177\000\000\000\235\230Z5\000\000\000\260\337\377\377\377"
所有阵列中的其它元件类似于:
char array_person_name[3][101];
char person_name[101] = "";
...
strncpy(person_name, "John Smith", strlen("John Smith")+1);
for(i=0;i<3;i++)
{
sprintf(array_person_name[i], person_name);
}
当我用gdb它读取(例如,“John Smith的” +空字符)检查第一个元素。现在我需要修改这个程序,以便在运行时未知数组大小的情况下工作,其结果需要与上面gdb打印的结果完全相同(除了null之后的字符可能不同)。这里是我的代码:
char **array_person_name;
char person_name[101] = "";
...
strncpy(person_name, "John Smith", strlen("John Smith")+1);
array_person_name = malloc(3 * sizeof(char*)); /* allocate memory for row pointers */
for(i=0;i<3;i++)
{
array_person_name[i] = malloc(101 * sizeof(char)); /* allocate memory for columns */
sprintf(array_person_name[i], person_name);
}
当我再检查用gdb的第一个元素,它读取:
(gdb) p array_person_name[0]
$1 = 0x6cff30 "John Smith"
我并不完全相信这两项计划GDB输出之间的差别是,但不管有什么不同,对于共享库来说就足够了,该库接受array_person_email
作为输入,以正确执行第一个代码块,并正确执行第二个代码块。有没有办法修改我的第二个代码块,以便array_person_email
看起来与第一个代码块的结果相同?
'的sprintf(PERSON_NAME [I],PERSON_NAME);'?不应该是'sprintf(array_person_name [i],person_name);'在这两种情况下? – 2012-04-08 15:56:06
此外,这不是'sprintf'(通常)的安全使用。如果您只想复制字符串,则使用'strcpy' /'strncpy'。 – 2012-04-08 15:56:40
是的,很好的接收,这是一个错字(我的代码有正确的变化) - 我会更新... – ggkmath 2012-04-08 15:57:19