用C中的任何白色space分隔字符串
Separating a string by any white space in C
我有一个字符串,例如“123 789”,我想要的结果是分隔此输出的字符串:
123
789
我已经创建了完成此操作的代码,通过找到 space 来分隔字符串。
我需要帮助来编辑我的代码,以通过回车符 return、换行符、垂直制表符、自由格式制表符或一系列空格来分隔字符串。基本上,任何白色 space 字符。目前,如果除单个 space 之外的任何其他内容分隔字符串的不同部分,我的代码就会中断。
这是我的代码,目前由一个 space:
分隔
int counter = 0; //counter used in loop
int index = test->current_index; //holds the current index of my string, it's initially 0
char *string = test->myString; //holds the whole string
char token_buffer = string[index];
//before loop: index = 0, counter = 0
while(test->current_index <= test->end_index)
{
counter = 0;
token_buffer = string[counter+index];
while(token_buffer != ' ' && (index+counter)<=test->end_index)
{
counter++;
token_buffer = string[index+counter];
}
char *output_token = malloc(counter+1);
strncpy(output_token,string+index,counter);
printf("%s \n", output_token);
TestProcessing(output_token); //sends each token to be processed further
//update information
counter++;
test->current_index += counter;
index += counter;
return 0;
}
似乎最容易修改此代码以满足您的要求,方法是包含 <ctype.h>
并将 token_buffer != ' '
替换为 !isspace(token_buffer)
。
或者,您可以将整个循环替换为调用 strcspn
(来自 <string.h>
)。
要像这样定义一个 util 函数,
int is_delimiter(char c)
{
char delimiters[] = {'[=10=]','\n','\r',' '};//customize to expand
for(int i = 0; i < sizeof(delimiters); i++){
if(delimiters[i] == c)
return 1;
}
return 0;
}
然后,
while(!is_delimiter(token_buffer) && (index+counter)<=test->end_index)
关于分隔字符串的最简单方法是使用 strtok
或 strsep
(均在 string.h
中):
#include <stdio.h>
#include <string.h>
int main (void) {
char string[] ="123 789";
char *p = NULL;
for (p = strtok (string, " "); p; p = strtok (NULL, " \n"))
printf (" %s\n", p);
return 0;
}
输出
$ ./bin/strtok_min
123
789
注意:原始字符串没有保留,以后需要原始的请复制一份。
我有一个字符串,例如“123 789”,我想要的结果是分隔此输出的字符串:
123
789
我已经创建了完成此操作的代码,通过找到 space 来分隔字符串。
我需要帮助来编辑我的代码,以通过回车符 return、换行符、垂直制表符、自由格式制表符或一系列空格来分隔字符串。基本上,任何白色 space 字符。目前,如果除单个 space 之外的任何其他内容分隔字符串的不同部分,我的代码就会中断。
这是我的代码,目前由一个 space:
分隔int counter = 0; //counter used in loop
int index = test->current_index; //holds the current index of my string, it's initially 0
char *string = test->myString; //holds the whole string
char token_buffer = string[index];
//before loop: index = 0, counter = 0
while(test->current_index <= test->end_index)
{
counter = 0;
token_buffer = string[counter+index];
while(token_buffer != ' ' && (index+counter)<=test->end_index)
{
counter++;
token_buffer = string[index+counter];
}
char *output_token = malloc(counter+1);
strncpy(output_token,string+index,counter);
printf("%s \n", output_token);
TestProcessing(output_token); //sends each token to be processed further
//update information
counter++;
test->current_index += counter;
index += counter;
return 0;
}
似乎最容易修改此代码以满足您的要求,方法是包含 <ctype.h>
并将 token_buffer != ' '
替换为 !isspace(token_buffer)
。
或者,您可以将整个循环替换为调用 strcspn
(来自 <string.h>
)。
要像这样定义一个 util 函数,
int is_delimiter(char c)
{
char delimiters[] = {'[=10=]','\n','\r',' '};//customize to expand
for(int i = 0; i < sizeof(delimiters); i++){
if(delimiters[i] == c)
return 1;
}
return 0;
}
然后,
while(!is_delimiter(token_buffer) && (index+counter)<=test->end_index)
关于分隔字符串的最简单方法是使用 strtok
或 strsep
(均在 string.h
中):
#include <stdio.h>
#include <string.h>
int main (void) {
char string[] ="123 789";
char *p = NULL;
for (p = strtok (string, " "); p; p = strtok (NULL, " \n"))
printf (" %s\n", p);
return 0;
}
输出
$ ./bin/strtok_min
123
789
注意:原始字符串没有保留,以后需要原始的请复制一份。