代码之家  ›  专栏  ›  技术社区  ›  Wizard

在C中输出文本块

c
  •  -1
  • Wizard  · 技术社区  · 6 年前

    我有一个很大的字符数组 data strncpy 就这么多。然而,当我去打印出来,我没有输出。一定有点小问题,但我看不出是怎么回事。

    char* data;
    int blocks[100], block_sizes[100];
    int traversed, block_idx, nl_chars, i, len, chars;
    char* block;
    
    // Determine output blocks
    nl_chars = 0;
    block_idx = 1;
    blocks[0] = 0;
    chars = 0;
    len = strlen(data);
    for (i = 0; i < len; i++) {
        chars++;
        if (data[i] == '\n') {
            nl_chars++;
        }
    
        if (data[i] == '\0' || nl_chars == 30) {
            blocks[block_idx] = i;
            block_sizes[block_idx - 1] = chars;
            block_idx++;
            nl_chars = 0;
            chars = 0;
        }
    }
    
    // Output blocks to stdout
    traversed = 0;
    while (traversed < block_idx) {
        block = malloc(block_sizes[traversed] * sizeof(char));
        if (block == NULL) {
            error("[-]Unable to allocate required memory");
        }
        strncpy(block, data + blocks[traversed], block_sizes[traversed]);
        printf("%s", block);
        free(block);
    
        while (1) {
            memset(input, 0, BUFFER_SIZE);
            fgets(input, sizeof(input), stdin);
            fflush(stdin);
            if (input[0] == '\n' || input[0] == '\r') {
                break;
            }
        }
    
        traversed++;
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Joop Eggen    6 年前

    i <= len 因为你想处理终止 \0 block_idx 从0开始,所以第二个循环也有一个可以理解的条件(block_count?)。

    strlen 返回不包括终止字符的字符数 . 也许更好:

    block = malloc((block_sizes[traversed] + 1) * sizeof(char));
    block[block_sizes[traversed]] = '\0';