我在数组中有类似“ - ··· - ”(摩尔斯电码)的字符串,并希望将每个字符串标记为每个单独的点(。)和短划线( - )。我的代码的一部分如下:
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: - - · 我是字符串标记的新手,可能在那里的某处犯了一个错误。也许我的分隔符是错的,我不确定。我希望我提供了足够的信息。对此的任何帮助将不胜感激。
提前致谢
答案 0 :(得分:2)
问题是字符串文字中的(Unicode)空白字符(例如“·· - ”)与strtok()
调用中的空白字符不同。
通过xxd
运行您的源代码并亲眼看看。
答案 1 :(得分:2)
这里不需要Strtok(你也不需要那些空格)。如果你想要字符串中的单个字符,你可以使用一个带有指针的简单循环:
char *current=&code;
然后确保循环直到字符串(null)字符结束:
while (*current != 0x0) {
if(*current != ' ') {
printf("CHARACTER: %c \n", *current);
current ++;
}
}
这是做什么的: 循环遍历代码中的字符,使用current作为指针,并检查null终止符。 然后使用if来检查空格,如果字符不是空格,则格式化它 - 将指针解析为那里的char。 最后它增加了指针。
大警告:如果你的字符串不是零终止(标准C字符串将是),这将开始打印愚蠢的东西。