strcpy()跳过数组元素

时间:2018-08-30 11:42:39

标签: c

我正在尝试将通过文本文件读入的行共享到共享内存中,以便我的客户端可以访问这些字符串。我的程序只打印第一和最后一个字符串,似乎忽略了第二和第三行。

例如,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);
}

1 个答案:

答案 0 :(得分:2)

问题是这样的:

k = strlen(words[j]);

您需要增加 k字符串的长度:

k += strlen(words[j]);

或者只需使用strcat来连接字符串:

strcat(mem, words[j]);

当然,这要求您首先将mem[0]初始化为字符串终止符'\0'