【问题标题】:Check if string is already printed检查字符串是否已经打印
【发布时间】:2015-11-29 12:20:45
【问题描述】:

我正在尝试构建一个 C 程序,它从文件中读取内容、标记内容并同时对标记进行分类,将标记复制到 temp 数组中。我的目标是打印以前没有的标记打印。换句话说,如果令牌已经打印,则跳过打印此令牌。我实现这一点的方法是创建一个函数来检查令牌是否出现在我的数组 temp 中。如果令牌出现在数组 temp 中,则返回 1,否则返回 -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++;
        }
}

【问题讨论】:

  • 面临什么问题?

标签: c string


【解决方案1】:

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

【讨论】:

  • 可能最好提供更多细节,因为他已经将return -1 移出循环,并且完全删除了 ;)
  • 你给了我一个想法。我使用标志而不是直接返回一个值。谢谢你。你的回答对我有所帮助!
【解决方案2】:

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


问题来了:

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

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

  1. 准备检查第一个单词,
  2. 虽然 temp 有更多的词,
  3. 检查令牌是第一个单词,
  4. 如果是,则返回 1 并中断,
  5. 否则,增加i 以检查第二个单词,
  6. 返回 -1(在检查其他单词之前)!!!!!!

所以,我会这样修改函数:

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
}

【讨论】:

    【解决方案3】:
    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;
    }
    

    我找到了解决方案,因为您的回答对我有所帮助。谢谢你。我使用了一个标志而不是直接返回一个值。

    【讨论】:

    • 阿德里安这样没问题,但是正如我的回答所示,您可以避免使用额外的变量(即标志)。此外,很高兴接受其他用户已经做出的答案(如果您喜欢 pmg 的答案,请接受该答案)并且不要发布与现有答案几乎相同的答案。
    • 堆栈溢出说,我可以在 2 天后接受答案 :(
    • Stackoverflow 表示您可以在两天后接受您的 OWN 答案。您现在可以接受任何其他答案,就像您所做的一样,太棒了!为您的问题 +1。
    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多