我对C很新,并试图编写一个解析字符串的函数,如:
“此(此处为5个空格)是(1个空格 这里一个(这里有2个空格)字符串。“
函数头将有一个指向传入的字符串的指针,例如:
bool Class::Parse( unsigned char* string )
最后,我想解析每个单词而不管单词之间的空格数,并将单词存储在动态数组中。
原谅愚蠢的问题...... 但是,如果我迭代每个角色,那么最有效的方法是什么呢?这是如何存储字符串的?所以,如果我开始迭代:
while ( (*string) != '\0' ) {
--print *string here--
}
打印出来
T
h
i... etc?
非常感谢您提供的任何帮助。
答案 0 :(得分:1)
来自http://www.cplusplus.com/reference/clibrary/cstring/strtok/
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-"); /* split the string on these delimiters into "tokens" */
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-"); /* split the string on these delimiters into "tokens" */
}
return 0;
}
拆分字符串“ - 这是一个示例字符串。”进入代币:
This
a
sample
string
答案 1 :(得分:0)
首先,C没有类,所以在C程序中,您可能会使用更像下列之一的原型来定义函数:
char ** my_prog_parse(char * string) {
/* (returns a malloc'd array of pointers into the original string, which has had
* \0 added throughout ) */
char ** my_prog_parse(const char * string) {
/* (returns a malloc'd NULL-terminated array of pointers to malloc'd strings) */
void my_prog_parse(const char * string, char buf, size_t bufsiz,
char ** strings, size_t nstrings)
/* builds a NULL-terminated array of pointers into buf, all memory
provided by caller) */
但是,完全可以在C ++中使用C风格的字符串...
您可以将循环编写为
while (*string) { ... ; string++; }
它将在现代优化编译器上编译为完全相同的汇编程序。是的,这是迭代C风格字符串的正确方法。
查看函数strtok
,strchr
,strstr
和strspn
...其中一个可以帮助您构建解决方案。
答案 2 :(得分:0)
我不会在C中做任何非平凡的解析,它太费力了,语言不适合。但是如果你的意思是C ++,并且它看起来像你做的那样,因为你编写了Class :: Parse,那么编写递归下降解析器非常简单,而且你不需要重新发明轮子。如果编译器支持C ++ 0x,则可以使用Spirit,例如AX。例如,AX中的解析器可以用几行编写:
// assuming you have 0-terminated string
bool Class::Parse(const char* str)
{
auto space = r_lit(' ');
auto string_rule = "This" & r_many(space, 5) & space & 'a' & r_many(space, 2)
& "string" & r_end();
return string_rule(str, str + strlen(str)).matched;
}