C中的字符串标记

时间:2014-09-29 15:39:31

标签: c string tokenize strtok

我在数组中有类似“ - ··· - ”(摩尔斯电码)的字符串,并希望将每个字符串标记为每个单独的点(。)和短划线( - )。我的代码的一部分如下:

char *code, *token;
    char x;
    char ch[4096];
    code = &ch[0];

   ..

while((x = tolower(fgetc(fp))) != EOF){
            printf("%c \n", x);
            switch(x){
                case 'a':
                    strcpy(code, "· −");
                    break;
                case 'b':
                    strcpy(code, "− · · ·");
                    break;
                case 'c':
                    strcpy(code, "− · − · ");
                    break;
                case 'd':
                    strcpy(code, "− · ·");
                    break;
                case 'e':
                    strcpy(code, "· ");
                    break;
                case 'f':
                    strcpy(code, "· · − ·" );
                    break;
                case 'g':
                    strcpy(code, "− − · ");
                    break;
                case 'h':
            }
            if(x!= 10){
                printf("Value read : %s \n", code);
                token = strtok(code, " ");
                while(token != NULL){
                    printf("CHARACTER: %s\n", token);
                    token = strtok(NULL, " ");
                }
            }

所以,当代码数组有“ - - ”时,我希望输出有:

CHARACTER: −
CHARACTER: −
CHARACTER: ·

然而,输出却有CHARACTER: - - · 我是字符串标记的新手,可能在那里的某处犯了一个错误。也许我的分隔符是错的,我不确定。我希望我提供了足够的信息。对此的任何帮助将不胜感激。

提前致谢

2 个答案:

答案 0 :(得分:2)

问题是字符串文字中的(Unicode)空白字符(例如“·· - ”)与strtok()调用中的空白字符不同。

通过xxd运行您的源代码并亲眼看看。

据我所知,strcpy()来电中的空格为U+200A,而strtok()来电中的空格为U+0020

答案 1 :(得分:2)

这里不需要Strtok(你也不需要那些空格)。如果你想要字符串中的单个字符,你可以使用一个带有指针的简单循环:

char *current=&code;

然后确保循环直到字符串(null)字符结束:

while (*current != 0x0) {
  if(*current != ' ') {
      printf("CHARACTER: %c \n", *current);
      current ++;
  }
}

这是做什么的: 循环遍历代码中的字符,使用current作为指针,并检查null终止符。 然后使用if来检查空格,如果字符不是空格,则格式化它 - 将指针解析为那里的char。 最后它增加了指针。

大警告:如果你的字符串不是零终止(标准C字符串将是),这将开始打印愚蠢的东西。