检查字符串是否已打印

时间:2015-11-29 12:20:45

标签: c string

我正在尝试构建一个C程序,它从文件中读取内容,对内容进行标记化并同时对标记进行分类,将标记复制到temp的数组中。我的目标是打印以前不是的标记打印。换句话说,如果已经打印了令牌,则从打印中跳过此令牌。我实现这一目标的方法是创建一个函数来检查令牌是否出现在我的数组temp中。如果令牌出现在数组temp中,则返回1 else返回-1。我的问题是,该功能不起作用,isAdded始终不是1.因此,它仍然打印以前打印的标记。我跟踪了我的代码,这对我来说似乎是正确的。我不知道为什么它总是返回-1。

这是我的代码:

char *temp[MAX]; /*globally declared*/


void tokenize(FILE *input){

char *token;
int k=0;

char word[1000];
while(!feof(input)){
    fgets(word,1000,input);
    token = strtok(word, " \t\n");
        while(token!=NULL){                     
            if(isAdded(token)!=1){
                if(isKeyword(token)==1){
                    printf("%s, %s\n", token, token);
                }
                temp[k] = (char*)malloc(strlen(token)+1);
                strcpy(temp[k],token);
                k++;
            }
            token= strtok(NULL, " \t\n");
        }
}
}


int isAdded(char *token){
        int i=0;
        while(temp[i]!=NULL){
            if(strcmp(temp[i],token)==0){
                return 1;
                break;
            }
            i++;
            return -1;
        }
}


int isKeyword(char *token){
    int i=0;
        while(resWord[i]!=NULL){
            if(strcmp(resWord[i],token)==0){
                return 1;
                break;
            }
            i++;
        }
}

3 个答案:

答案 0 :(得分:1)

将最后return移到while循环之外。

答案 1 :(得分:0)

提示:当函数执行return语句时,它会在此时终止,并且不会执行此函数的任何其他行!

问题在于:

while(temp[i]!=NULL){
  if(strcmp(temp[i],token)==0){
    return 1;
    break;
  }
  i++;
  return -1;
}

向自己解释一下这段代码的作用:

  1. 准备检查第一个字,
  2. 虽然临时有更多的话,
  3. 检查令牌是第一个字,
  4. 如果是,则返回1并中断,
  5. 否则,请增加i以检查第二个字,
  6. 返回-1(在检查其他词之前)!!!!!!
  7. 所以,我会修改这些函数:

    int isAdded(char *token){
      int i=0; // begin from the start
      while(temp[i] != NULL) { // while temp has more words
        if(strcmp(temp[i],token) == 0) { // is token same as current word?
          return 1;  // yes return 1 (the functions TERMINATES here, break is not needed after that)
        }
        i++; // token was not the current word, increment counter by one
      }
      // if we reach this point, it means that we didn't find token inside temp[],
      // so return -1 (not found)
      return -1
    }
    

答案 2 :(得分:0)

int isAdded(char *token){
    int i=0, flag=0;
    while(temp[i]!=NULL){
        if(strcmp(temp[i],token)==0){
            flag=1;
            break;
        }
        i++;
    }
    if(flag==1)
        return 1;
    else 
        return -1;
}

我找到了解决方案,因为你的回答在某种程度上帮助了我。谢谢。我使用了一个标志而不是直接返回一个值。