在 C 中,如何通过分隔符分隔 char 数组?还是操作字符串更好?有哪些好的 C 字符操作函数?
问问题
112692 次
7 回答
22
#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 是你想要拆分的字符串。然后你使用 strtok(NULL, ",")。如果返回值为 true ,则可以打印另一组。
于 2012-04-27T13:58:27.773 回答
12
看看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
于 2012-04-27T10:51:37.507 回答
4
一种选择是 strtok
例子:
char name[20];
//pretend name is set to the value "My name"
您想在两个单词之间的空格处拆分它
split=strtok(name," ");
while(split != NULL)
{
word=split;
split=strtok(NULL," ");
}
于 2012-04-27T10:54:10.297 回答
3
您可以简单地用 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 个分隔字符,则此代码当然不起作用。
于 2012-04-27T10:58:35.553 回答
3
我想出了这个。这似乎对我最有效。它转换一串数字并将其拆分为整数数组:
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;
}
于 2015-09-05T15:41:19.853 回答
1
我就是这样做的。
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;
}
于 2018-10-29T17:23:11.347 回答
0
此外,您可以sscanf
用于一些非常简单的场景,例如当您确切知道字符串有多少部分以及它由什么组成时。您还可以即时解析参数。不要将其用于用户输入,因为该函数不会报告转换错误。
例子:
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()是您的最佳选择,如其他答案中所述。
于 2019-04-10T18:09:30.753 回答