我有一个大字符数组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++;
}
答案 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';