void split(char array[]) {
int length, length2, half;
char first_half[BUF], sec_half[BUF];
length = strlen(array);
length2 = length / 2;
length -= length2;
strncpy(first_half, array, length - 1);
strncpy(sec_half, (array + length), length2 - 1);
printf("%s\n", first_half);
printf("%s\n", sec_half);
}
如果输入是“人”,则输出:
皮奥兹
plcy等。。。只是想知道这里有什么问题。
我的问题和刚才提到的问题不一样。我不是想在另一个词中间插入一个词,而是想把一个词分成两半,把两半放在两个字符串中。
最佳答案
OP的问题是first_half[BUF], sec_half[BUF]
不一定是以空字符结尾的,strncpy()
的缩写。
strncpy( first_half, array, length);
// printf( "%s\n", first_half );
// alternative limited width print, even if `first_half` lacks a null character.
printf( "%.*s\n", length, first_half );
试着把一个字串分成两半,把两半放进两半。
下面是可变长度数组(VLA)方法。
我建议使用
memcpy()
,因为这对于长字符串来说通常是最快的,而且比strncpy()
@Blastfurnace更容易出错。YMMV。void split(const char array[]) {
size_t a_length = strlen(array);
size_t l_length = a_length / 2;
size_t r_length = a_length - l_length;
char l_half[l_length + 1], r_half[r_length + 1]; // + 1 for null character
memcpy(l_half, array, l_length);
l_half[l_length] = '\0';
memcpy(r_half, array + l_length, r_length + 1); // +1 for null character
printf("<%s>\n", l_half);
printf("<%s>\n", r_half);
}
size_t
,一个无符号类型,是用于数组索引的大小合适的整数类型。int
可能不够。注意strlen()
返回类型size_t
。如果只想打印两个半部分,则不需要太多代码:
void split_print(const char array[]) {
int half = strlen(array) / 2;
printf("%.*s\n", half, array);
printf("%s\n", array + half);
}