c - strcpy() 跳过数组元素

标签 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);
}

最佳答案

问题是这样的:

k = strlen(words[j]);

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

k += strlen(words[j]);

或者简单地使用 strcat连接字符串:

strcat(mem, words[j]);

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

关于c - strcpy() 跳过数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52096222/

相关文章:

objective-c - CoreMIDI:坚如磐石的 MIDI 同步

c - struct成员变量的内存分配

c - 接受安全/面向 future 的方式来解析/proc/%d/stat?

c - 试图了解一个变量在这个小程序中从哪里获得它的值(value)

c - 在 Linux 中处理系统(命令)调用超时

c++ - 仅使用位操作(无分支)将 16 位有符号值限制在 0 到 4095 之间

c - C 中字符串的字母数字排序顺序

c - 为什么 pthread_cond_wait 有虚假唤醒?

c - 有没有办法让我的二进制文件对 Linux 中的某些全局热键使用react?

c - 使用 ioctl 在 linux 中获取 IPv6 地址