在C中解析具有不同数量的空白字符的字符串

时间:2011-06-02 19:00:33

标签: string parsing whitespace varying

我对C很新,并试图编写一个解析字符串的函数,如:

  

“此(此处为5个空格)(1个空格   这里一个(这里有2个空格)字符串。“

函数头将有一个指向传入的字符串的指针,例如:

bool Class::Parse( unsigned char* string )

最后,我想解析每个单词而不管单词之间的空格数,并将单词存储在动态数组中。

原谅愚蠢的问题...... 但是,如果我迭代每个角色,那么最有效的方法是什么呢?这是如何存储字符串的?所以,如果我开始迭代:

while ( (*string) != '\0' ) {

--print *string here--

}

打印出来

T
h
i... etc?

非常感谢您提供的任何帮助。

3 个答案:

答案 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风格字符串的正确方法。

查看函数strtokstrchrstrstrstrspn ...其中一个可以帮助您构建解决方案。

答案 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;
}