我正在尝试将通过文本文件读入的行共享到共享内存中,以便我的客户端可以访问这些字符串。我的程序只打印第一和最后一个字符串,似乎忽略了第二和第三行。
例如,abcd和mnop将像这样打印出来:
abcdmnop
abcdmnop
abcdmnop
abcdmnop
如果这是.txt文件:
abcd
efgh
ijkl
mnop
我相信主程序中的这个循环可能是
for (int j = 0, k = 0; j < i; j++) {
strcpy((mem + k), words[j]);
k = strlen(words[j]);
}
这是我的主程序:
int main() {
const key_t key = 56871;
FILE *ptr_fp;
char words[600][600];
char *mem;
int i = 0;
ptr_fp = fopen("file.txt", "r");
int shmid = shmget(key, sizeof(float) * 8, 0644 | IPC_CREAT);
if (shmid < 0) {
perror("shmget");
exit(1);
}
if (ptr_fp != NULL) {
while (fgets(words[i], 600, ptr_fp )&& i < 600) {
i++;
}
}
mem = (char *)shmat(shmid, NULL, 0);
if (mem == (char *)-1) {
perror("shmat error\n");
exit(1);
} else {
for (int j = 0, k = 0; j < i; j++) {
strcpy((mem + k), words[j]);
k = strlen(words[j]);
}
}
return 0;
}
这是我的客户端程序循环:
for (int i = 0; i < 4; i++) {
printf("%s\n", mem);
}
答案 0 :(得分:2)
问题是这样的:
k = strlen(words[j]);
您需要增加 k
字符串的长度:
k += strlen(words[j]);
或者只需使用strcat
来连接字符串:
strcat(mem, words[j]);
当然,这要求您首先将mem[0]
初始化为字符串终止符'\0'
。