【问题标题】:String tokening in CC中的字符串标记
【发布时间】:2014-09-29 15:39:31
【问题描述】:

我在一个数组中有像“- · · · -”(摩尔斯电码)这样的字符串,并且想要对每个字符串进行标记以获取每个单独的点(。)和破折号(-)。我的部分代码如下:

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: − − · 我是字符串标记的新手,可能在某处犯了错误。也许我的分隔符是错误的,我不确定。我希望我已经提供了足够的信息。对此的任何帮助将不胜感激。

提前致谢

【问题讨论】:

  • 注意:使用int x;EOF 与所有其他char 区分开来。
  • 顺便说一句:您是否声明字母之间的间隔无关紧要?
  • 另外,考虑进行表查找而不是切换。
  • 其实你没事。实际上,我已经从在线资源中复制粘贴了莫尔斯电码(点划线序列)。在那里,空间似乎与滚动条给出的空间不同。这就是分隔符不匹配的原因。谢谢大家!!

标签: c string tokenize strtok


【解决方案1】:

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

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

据我所知,strcpy() 调用中的空格是U+200A,而strtok() 调用中的空格是U+0020

【讨论】:

  • 这很奇怪,因为这段代码运行良好cplusplus.com/reference/cstring/strtok你会建议什么替代方案?
  • @LoganMurphy:我将问题中的代码复制并粘贴到编辑器中,直到我用普通的 U+0020 空格替换 U+200A 空格后它才起作用。
  • 它是否依赖于编译器?也许 op 可以设置一个编译器选项
  • @NPE:扔掉编辑器。它不应该将 U+0020 变成 U+200A。文字处理器可能会这样做,但不是合适的代码编辑器。
【解决方案2】:

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

char *current=&code;

然后确保循环到字符串(空)字符的结尾:

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

这是做什么的: 循环代码中的字符,使用 current 作为指针,并检查空终止符。 然后它使用 if 来检查空格,如果字符不是空格,则 format 打印它 - 将指针解引用到那里的字符。 最后它增加指针。

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

【讨论】:

  • 需要以某种方式跳过空格。
  • 他可以加一个 if 吗?
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2010-09-20
  • 2011-05-31
  • 1970-01-01
相关资源
最近更新 更多