Cでは、区切り文字でchar配列をどのように区切ることができますか?または、文字列を操作する方が良いですか?良いC文字操作関数とは何ですか?
#include<string.h>
#include<stdio.h>
int main()
{
char input[16] = "abc,d";
char *p;
p = strtok(input, ",");
if(p)
{
printf("%s\n", p);
}
p = strtok(NULL, ",");
if(p)
printf("%s\n", p);
return 0;
}
このプログラムを見ることができます。最初にstrtok(input、 "、")を使用する必要があります。inputはspiltする文字列です。戻り値がtrueの場合、他のグループを印刷できます。
strtok() 。strtok()はリエントラント関数ではありません。
strtok_r() は、strtok()の再入可能バージョンです。マニュアルのプログラム例は次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *str1, *str2, *token, *subtoken;
char *saveptr1, *saveptr2;
int j;
if (argc != 4) {
fprintf(stderr, "Usage: %s string delim subdelim\n",argv[0]);
exit(EXIT_FAILURE);
}
for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
token = strtok_r(str1, argv[2], &saveptr1);
if (token == NULL)
break;
printf("%d: %s\n", j, token);
for (str2 = token; ; str2 = NULL) {
subtoken = strtok_r(str2, argv[3], &saveptr2);
if (subtoken == NULL)
break;
printf(" --> %s\n", subtoken);
}
}
exit(EXIT_SUCCESS);
}
異なる区切り文字に基づいて前のトークンから取得されたサブトークンで動作するサンプル実行:
$ ./a.out hello:Word:bye=abc:def:ghi = :
1: hello:Word:bye
--> hello
--> Word
--> bye
2: abc:def:ghi
--> abc
--> def
--> ghi
1つのオプションはstrtokです
例:
char name[20];
//pretend name is set to the value "My name"
2つの単語の間のスペースで分割したい
split=strtok(name," ");
while(split != NULL)
{
Word=split;
split=strtok(NULL," ");
}
区切り文字を単にNULL文字に置き換え、新しく作成されたNULL文字の後のアドレスを新しいchar *ポインターに格納できます。
char* input = "asdf|qwer"
char* parts[10];
int partcount = 0;
parts[partcount++] = input;
char* ptr = input;
while(*ptr) { //check if the string is over
if(*ptr == '|') {
*ptr = 0;
parts[partcount++] = ptr + 1;
}
ptr++;
}
入力文字列に9文字以上の区切り文字が含まれている場合、このコードはもちろん機能しないことに注意してください。
私はこれを思いついたが、これは私にとって最もうまくいくようで、数字の文字列を変換して整数の配列に分割します:
void splitInput(int arr[], int sizeArr, char num[])
{
for(int i = 0; i < sizeArr; i++)
// We are subtracting 48 because the numbers in ASCII starts at 48.
arr[i] = (int)num[i] - 48;
}
これが私のやり方です。
void SplitBufferToArray(char *buffer, char * delim, char ** Output) {
int partcount = 0;
Output[partcount++] = buffer;
char* ptr = buffer;
while (ptr != 0) { //check if the string is over
ptr = strstr(ptr, delim);
if (ptr != NULL) {
*ptr = 0;
Output[partcount++] = ptr + strlen(delim);
ptr = ptr + strlen(delim);
}
}
Output[partcount++] = NULL;
}
さらに、いくつかの非常に単純なシナリオにsscanf
を使用できます。たとえば、正確にいくつparts文字列が持っているものとその構成要素。引数をその場で解析することもできます。 関数は変換エラーを報告しないため、ユーザー入力に使用しないでください。
例:
char text[] = "1:22:300:4444:-5";
int i1, i2, i3, i4, i5;
sscanf(text, "%d:%d:%d:%d:%d", &i1, &i2, &i3, &i4, &i5);
printf("%d, %d, %d, %d, %d", i1, i2, i3, i4, i5);
出力:
1、22、300、4444、-5
より高度なものについては、 strtok() および strtok_r() が最適なオプションです。他の回答で述べています。