我有此代码:
main() {
printf("enter the number of names: ");
int n;
scanf("%d", &n);
getchar();
char *p;
p = malloc(n*LEN*sizeof(char));
char *name = malloc(LEN*sizeof(char));
int i;
for(i = 0; i < n; i++) {
gets(name);
strcpy((p + i), name);
printf("%s \n", (p + i));
strncpy(name, "", LEN);
}
for(i = 0; i < n; i++)
printf("%s\n", (p + i));
}
并且我在打印指针 p 的值时遇到麻烦,这在第一个循环中是正确的,但是在第二个循环中,输出是错误的。(LEN定义为15)。问题出在哪里?
答案 0 :(得分:2)
在此代码中
char *p;
p = malloc(n*LEN*sizeof(char));
char *name = malloc(LEN*sizeof(char));
int i;
for(i = 0; i < n; i++) {
gets(name);
strcpy((p + i), name);
printf("%s \n", (p + i));
strncpy(name, "", LEN);
}
您有一个char
数组,并且在i
为0时(例如, “你好”。
当i
为1时,如果您将“世界”用作下一个名称,则将其放在p[1]
中,因此p[0]
仍为'H',为您提供'HWorld'
。 / p>
在循环中,每个char **
都需要一个malloc
和char *
。
(不要忘了以后free
分配您的内容)
答案 1 :(得分:1)
假设LEN
是最大字符串长度,那么您分配了一大块要放入字符串的内存。
然后将第i
个字符串放在strcpy((p + i*LEN), name);
您还应该注意字符串不要太长并且被终止,所以更好地使用
strncpy((p + i*LEN), name, LEN-1);
*(p+i*LEN-1)= '\0';