|
きれい、スムーズではないですが、
以下でwk_strに処理された位置がかえされます。
あとは、呼び出し側の工夫でできると思います。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(int argc,char *argv[])
{
char str[128] ;
char wk_str[128] ;
char cut_str[21] ;
memset(str,'\0',sizeof str) ;
memset(wk_str,'\0',sizeof wk_str) ;
memset(cut_str,'\0',sizeof cut_str) ;
strcpy(str,"アイウエオアイウエオ1234512345") ;
strncpy(wk_str,str,strlen(str)) ;
cut_string(wk_str,cut_str,10) ;
printf(" in = [%s]\n",str) ;
printf("out = [%s]\n",cut_str) ;
printf(" wk = [%s]\n",wk_str) ;
}
int cut_string(char *in_data,char *out_data,int len)
{
char w_str[128] ;
char *tmp_str ;
char c ;
int i ;
if (strlen(in_data) <=len) {
strncpy(out_data,in_data,strlen(in_data)) ;
}
memset(w_str,'\0',sizeof(w_str)) ;
i = 0 ;
tmp_str = in_data ;
while (*tmp_str) {
c = *tmp_str ;
if ((c & 0xFF) >= 0x81 && (c & 0xFF) <= 0x9F || (c & 0xFF) >= 0xE0 && (c & 0xFF) <= 0xFC) {
if (i + 2 <= len) {
w_str[i] = *tmp_str++ ;
w_str[++i] = *tmp_str++ ;
i++ ;
} else {
break ;
}
} else {
if (i + 1 <= len) {
w_str[i] = *tmp_str++ ;
i++ ;
} else {
break ;
}
}
}
strncpy(out_data,w_str,strlen(w_str)) ;
*(out_data + strlen(w_str)) = '\0' ;
printf("move position [%s]\n",tmp_str) ;
strncpy(in_data,tmp_str,strlen(tmp_str)) ;
*(in_data + strlen(tmp_str)) = '\0' ;
}
|