用C输出文本块

时间:2018-08-20 13:46:36

标签: c

我有一个大字符数组data,我想一次将其输出到终端30行。因此,我决定对每30个新行字符之间的字符数进行计数,因此我可以将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 个答案:

答案 0 :(得分:2)

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

因此:strlen返回不包含终止符\0的字符数。也许更好:

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