【问题标题】:Strtok + If StatementStrtok + If 语句
【发布时间】:2012-09-06 07:32:32
【问题描述】:

我是新来的,我对我的程序感到头疼,问题是我需要从键盘获取输入,然后使用 strtok 将其分隔,但必须使用 4 种不同的情况来分隔标记,并且在每种情况下我需要打印结果并将其保存到这样的字符串中:

input String : Label Instruction #50,Y; Label <with>

输出应该是这样的:

Label: Label
Instruction: Instruction
Character [1]: #50
Character [2]: Y
Comentaries: Label <with>

如果这样错过了一条指令,它还必须能够重新调整:

Input String: adda
Output String
Label: -----
Instruction: adda
Character 1: -----
Comentaries: -----

我的代码可以接受第一个和正确的指令,但是当我在第二个输入中键入不正确的指令时,它会忽略它并像第一次尝试一样继续,有时只是添加,我尝试使用 if 来分隔每个令牌使用它的分隔符,但每次我编译它时,它都会忽略 if 语句,无论我给它什么参数,我不知道还能做什么 这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
int main() {     char word[256];
    fgets(word,256,stdin);
char *token;
while (token != NULL){
            char delimiter[]="\n , ;";
            token=strtok (word,delimiter);
            //if(token != "\n")            //{
            //char delimiter[]="\n , ;";
//token=strtok (word,delimiter);
//if (delimiter != " "||"\t" || "_")
            printf("Label \"%s\"\n", token);
token = strtok (NULL, "\n , ;");   //(NULL, "_,.-")//}
            //token=strtok (word,delimiter);            //}
//printf("Label ----------\n");
if (delimiter != "\n"||"\t")//{
            printf("Instruction \"%s\"\n", token);
token = strtok (NULL, "\n , ;");   //(NULL, "_,.-")//}
printf("Character \"%s\"\n", token);
token = strtok (NULL, "\n , ;");   //(NULL, "_,.-")
printf("Character 2 \"%s\"\n", token);
token = strtok (NULL, "\n , ;");   //(NULL, "_,.-")
printf("Comentaries \"%s\"\n",token);
token = strtok (NULL, ";");
//            printf("Character 2\"%s\"\n", token);
//           token = strtok (NULL, "\n , ;");   //(NULL, "_,.-")
token = NULL;}
//token = NULL;
//printf("Comentaries \"%s\"\n", token);
//token = NULL;
return(0);
}

// 评论是我试图让它发挥作用的所有失败尝试 =( 有人可以帮帮我吗?

【问题讨论】:

  • char *token; while (token != NULL) 似乎是错误的。无法保证 token 将被初始化为非 NULL。
  • 解析器如何知道'adda'不是标签?

标签: c if-statement strtok


【解决方案1】:
char *token;
while (token != NULL){

token 在哪里初始化?

然后:

if (delimiter != "\n"||"\t")

您只是比较 if 控制表达式中的指针:使用 strcmp 函数比较字符串。

【讨论】:

  • || 也不是这样工作的。您需要明确地将delimiter 与每一个进行比较。
  • 我已经尝试使用 strcmp,但我认为我没有正确使用它,因为当我只想单独比较分隔符或标记时,它只会比较完整字符串
【解决方案2】:

我可以看到您的代码存在各种问题,如下所列:

1.您的 while 循环基于未初始化的 token。最好使用do/while

2.delimiter 是一个字符串,不能使用!= 运算符进行比较。使用strcmp/strncmp

3.每次迭代时检查分隔符的意义何在?每次都分配相同的值?我不确定你这样做是为了达到什么目的。 AFAIK,delimiter 的值在调用 strtok 时不会改变。

4.token 应该在每次调用 strtok 之前通过 NULL 检查,因为您可以输入“错误”字符串。

5. 没有错,但为什么 fgets 用于从标准输入获取输入,而您可以简单地执行 scanf

希望以上能解决您的问题。

【讨论】:

  • 感谢您的回答我根据您的建议对代码进行了更正,我将 while 更改为 do while,我尝试使用 strcmp 但由于我不知道如何将我的令牌保存到单独的字符串,以便我可以使用 strcmp 我不知道我还能如何使用它,因为当你说 NULL 检查你是什么意思时,我必须使用 if-statemnt 来检查我的分隔符是 null 还是我的斯特克?最后我尝试使用 scanf,但是当我想检查第一个字符是“空格/s”还是“制表符/s”时,它可以正常工作
  • 1) 你可以使用strcpy 来复制字符串。 2) 每次调用strtok 后,您必须对指针token (if (token != NULL)) 进行NULL 检查,以确保您的字符串是否完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2016-03-26
  • 1970-01-01
  • 2016-03-02
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多