【问题标题】:C - How to count exact word in a string? (exluding the times the word is inside of another)C - 如何计算字符串中的确切单词? (不包括单词在另一个单词中的时间)
【发布时间】:2017-01-08 22:30:42
【问题描述】:

我正在制作一个程序,它从标准输入或文件中读取并计算 if 语句的数量。我已经完成了,但如果我有一个名为“asdifasd”或“ifasd”的变量,它应该被算作一个 if 语句。如何仅提取 if 语句?这是我的代码:

char str[150];
int ifs = 0;

while (fgets(str, sizeof(str), stdin) != NULL)
    {
        char *p = str;
        while (((p = (strstr(p, "if"))) != NULL)) {
            ifs++;
            ++p;
        }
    }

我一直在考虑用strncmp 做点什么,但我不知道怎么做。

【问题讨论】:

  • 不确定我是否理解您的问题 - 即使在单词中间,代码也会按照您的要求计算所有“如果”??
  • 告诉我们,ifasdif (asd) 之间的明显区别是什么?你怎么能用它来解决你的问题?
  • 不,伙计,我希望它只计算 if 语句。我不希望它算作“int qweif = 0;”作为 if 语句。
  • @kaylum 我试过数 "if(" 和 "if" 但我想我不知道怎么做,结果失败了
  • 好吧,然后向我们展示这个尝试。除非您向我们展示该代码,否则我们无法告诉您您做错了什么。

标签: c string word


【解决方案1】:

使用 strstr 找到“if”后,检查紧接前后的字符以确保它们不是字母。喜欢:

{
  char *p = str;
  while (((p = (strstr(p, "if"))) != NULL)) {
    if ((p == str || !isalnum((unsigned char) p[-1])) &&
         !isalnum((unsigned char) p[2]))
      ++ifs;
    ++p;
  }
}

【讨论】:

  • “确保它们不是字母”。这还不够。例如,下划线 (_) 不是字母,但它是变量名中的有效字符。
  • 在“单词”的定义中调整我的示例以包含下划线当然是微不足道的。
  • 写一个完整而准确地解决问题的答案肯定是微不足道的吗?
  • @Waxrat 谢谢!有用。我尝试的是创建两个 while 循环,一个搜索“if”,另一个搜索“if(”,但我认为它仍然存在一些缺陷。我认为您的解决方案效果更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多