【问题标题】:Warning comparsion between pointer and string指针和字符串的警告比较
【发布时间】:2017-12-10 07:54:39
【问题描述】:

我想输入一个字符串,如果它包含两个连续的“HH”,那么它应该在屏幕上打印出“voila”,如果它不包含它应该返回“No voila”

int main()
{   

 char str[100];
 printf("Enter string");      
 scanf("%s",str);   

for (i=0;i<strlen(str); i++)
{


    if (str[i] && str[i+1] == "HH" )
    {
        printf("voila");
    }
    else{
        printf("No voila");
    }

 }
return 0;
 }

如果一个字符串被扫描并且它包含两个连续的“H”它应该打印出来瞧

我得到的警告是指针和整数之间的比较 请纠正我的代码,因为我是 c 的初学者。 提前感谢您的回答。

【问题讨论】:

  • 我不认为str[i] == "HH" 做你期望它做的事情
  • 请改用strcmp(str, "HH") == 0。瞧。
  • 你调试过你的代码吗?
  • @RingØ:那行不通。

标签: c string pointers integer


【解决方案1】:

你说:

如果它包含两个连续的“HH”,那么它应该在屏幕上打印出“voila”

我假设您的意思是两个连续的Hs,而不是两个连续的"HH"s。

对于第一个,您需要寻找"HH",而对于后者,您需要寻找"HHHH"

无论哪种情况,您都需要使用strstr

if ( strstr(str, "HH") != NULL ) 
{
    printf("voila");
}

【讨论】:

    【解决方案2】:

    "HH" 这是字符串文字,当我们在比较中使用它时,它的地址将与字符 str[i] 的 ascii 值进行比较。这就是您收到警告消息的原因。

    解决方案是使用strcmp(str,"HH")==0 然后打印瞧瞧。(这意味着str"HH" 匹配)。

    这里不需要循环。所以你只需这样做

    if( strcmp(str,"HH") == 0)
        printf("voila");
    else
        printf("No voila");
    

    编辑:(错过了HH的连续两次出现的部分)

    同样,如果您需要查找连续出现,那么此解决方案将不起作用,因为它与内容完全匹配。然后您需要使用strstr 或类似的函数来查找字符串中子字符串的出现。

    从标准 7.24.5.7

     char *strstr(const char *s1, const char *s2);
    

    strstr 函数定位指向的字符串中的第一个匹配项 通过字符序列的s1(不包括终止的null 字符)在s2 指向的字符串中。 strstr 函数返回一个指向所定位字符串的指针,或者一个 null 找不到字符串时的指针

    没有任何功能:

    要查找单个事件,您也可以这样做

    for(size_t  i = 0;  i<=strlen(str)-2; i++)
        if( str[i] == 'H' && str[i+1] == 'H'){
           printf("Voila");
           return 0;
        }
    printf("No voila");
    return 0;
    

    请注意,我们正在与 'H' 比较字符而不是文字 "H"

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      for (i=0;i<strlen(str); i++)
      {    
          int flag=0;
          if (str[i] == "H" )
          {
             if(flag>0)
             {
              printf("voila");
             } else {
                flag++;
             }
          } else {
             flag=0;
             printf("No voila");
          }
       }
      

      【讨论】:

      • 字符串"HHH"怎么样?哦,那是合格的(没有仔细阅读Q)。但是你可能有许多混合的“瞧/不瞧”(例如“ABHHDEHH”)......尝试解决这个问题(例如通过计算连续'H'的最大数量,并且只在循环后显示消息)跨度>
      【解决方案4】:

      这应该会有所帮助:

      #include <stdio.h>
      #include <string.h>
      
      int main()
      {
      
      
      char str[100];
      printf("Enter string");
      
      scanf("%s",str);
      int flag = 0;
      
      for (int i=0;i<strlen(str) - 1; i++)
      {
      
      
          if (str[i] == 'H' && str[i+1] == 'H')
          {
      
              flag = 1;
              break;
          }
       }
      
      if (flag){
          printf("voila");
      }
      else {
          printf("no voila");
      }
      return 0;
       }
      

      您收到的警告是因为您一次将charstring HH 在线str[i] == "HH" 进行比较

      【讨论】:

      • 如果输入包含空格后跟HH,这将不起作用。
      最近更新 更多