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

10-04 12:21
查看更多