fork download
  1. #include <stdio.h>
  2.  
  3. /* UTF8の次の文字をoutに格納し、そのバイト数を返す。
  4.  * 不正バイト列のチェックは行わない。
  5.  * (bufの先頭がナル文字でなければ)outにナル文字は格納しない。
  6.  */
  7. int get_next_utf8_char(char *out, const char *buf) {
  8. int bytes = 1;
  9. int i;
  10. if ((buf[0] & 0x80) == 0x00) {
  11. bytes = 1;
  12. } else {
  13. int now_mask = 0xE0;
  14. int now_puttern = 0xC0;
  15. for (i = 2; i <= 6; i++) {
  16. if ((buf[0] & now_mask) == now_puttern) {
  17. bytes = i;
  18. break;
  19. }
  20. now_mask = (now_mask >> 1) | 0x80;
  21. now_puttern = (now_puttern >> 1) | 0x80;
  22. }
  23. }
  24. for (i = 0; i < bytes; i++) out[i] = buf[i];
  25. return bytes;
  26. }
  27.  
  28. void split_string(const char *input, char *mess1, char *mess2, int length) {
  29. int i;
  30. for (i = 0; *input != '\0' && i < length; i++) {
  31. int length = get_next_utf8_char(mess1, input);
  32. mess1 += length;
  33. input += length;
  34. }
  35. *mess1 = '\0';
  36.  
  37. while (*input != '\0') {
  38. int length = get_next_utf8_char(mess2, input);
  39. mess2 += length;
  40. input += length;
  41. }
  42. *mess2 = '\0';
  43. }
  44.  
  45. int main(void) {
  46. const int sample_length[] = {0, 5, 7, 11, 12, 30, -1};
  47. const char* samples[] = {
  48. "1234567891011121314",
  49. "Cat「にゃーん!!」",
  50. "𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪",
  51. NULL
  52. };
  53. char mess1[100], mess2[100];
  54. int i, j;
  55.  
  56. for (i = 0; sample_length[i] >= 0; i++) {
  57. printf("length = %d\n", sample_length[i]);
  58. for (j = 0; samples[j] != NULL; j++) {
  59. split_string(samples[j], mess1, mess2, sample_length[i]);
  60. printf("(input, mess1, mess2) = (\"%s\", \"%s\", \"%s\")\n",
  61. samples[j], mess1, mess2);
  62. }
  63. }
  64. return 0;
  65. }
  66.  
Success #stdin #stdout 0s 2292KB
stdin
Standard input is empty
stdout
length = 0
(input, mess1, mess2) = ("1234567891011121314", "", "1234567891011121314")
(input, mess1, mess2) = ("Cat「にゃーん!!」", "", "Cat「にゃーん!!」")
(input, mess1, mess2) = ("𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪", "", "𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪")
length = 5
(input, mess1, mess2) = ("1234567891011121314", "12345", "67891011121314")
(input, mess1, mess2) = ("Cat「にゃーん!!」", "Cat「に", "ゃーん!!」")
(input, mess1, mess2) = ("𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪", "𦥑𦥑𦥑𦥑𦥑", "Cafè du Lapin𦣪𦣪𦣪𦣪𦣪")
length = 7
(input, mess1, mess2) = ("1234567891011121314", "1234567", "891011121314")
(input, mess1, mess2) = ("Cat「にゃーん!!」", "Cat「にゃー", "ん!!」")
(input, mess1, mess2) = ("𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪", "𦥑𦥑𦥑𦥑𦥑Ca", "fè du Lapin𦣪𦣪𦣪𦣪𦣪")
length = 11
(input, mess1, mess2) = ("1234567891011121314", "12345678910", "11121314")
(input, mess1, mess2) = ("Cat「にゃーん!!」", "Cat「にゃーん!!」", "")
(input, mess1, mess2) = ("𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪", "𦥑𦥑𦥑𦥑𦥑Cafè ", "du Lapin𦣪𦣪𦣪𦣪𦣪")
length = 12
(input, mess1, mess2) = ("1234567891011121314", "123456789101", "1121314")
(input, mess1, mess2) = ("Cat「にゃーん!!」", "Cat「にゃーん!!」", "")
(input, mess1, mess2) = ("𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪", "𦥑𦥑𦥑𦥑𦥑Cafè d", "u Lapin𦣪𦣪𦣪𦣪𦣪")
length = 30
(input, mess1, mess2) = ("1234567891011121314", "1234567891011121314", "")
(input, mess1, mess2) = ("Cat「にゃーん!!」", "Cat「にゃーん!!」", "")
(input, mess1, mess2) = ("𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪", "𦥑𦥑𦥑𦥑𦥑Cafè du Lapin𦣪𦣪𦣪𦣪𦣪", "")