0

我对 C 很陌生,并尝试编写一个解析字符串的函数,例如:

“这个(这里 5 个空格)(这里 1 个空格)一个(这里 2 个空格)字符串。”

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

bool Class::Parse( unsigned char* string )

最后,无论单词之间有多少空格,我都想解析每个单词,并将单词存储在动态数组中。

原谅这些愚蠢的问题......但是如果我遍历每个角色,最有效的方法是什么?字符串是这样存储的吗?因此,如果我要开始迭代:

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

--print *string here--

}

那会打印出来吗

T
h
i... etc?

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

4

3 回答 3

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 
于 2011-06-02T19:13:49.917 回答
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... 其中一个可以帮助您构建解决方案。

于 2011-06-02T19:21:32.120 回答
0

我不会在 C 中进行任何重要的解析,这太费力了,该语言不适合这样做。但是,如果您的意思是 C++,并且看起来确实如此,因为您编写了 Class::Parse,那么编写递归下降解析器非常容易,您不需要重新发明轮子。如果您的编译器支持 C++0x,您可以使用 Spirit 或 AXE。例如,您在 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;
}
于 2011-06-02T20:38:41.177 回答