【问题标题】:stuck in array and string compare with strcmp c [closed]卡在数组和字符串与 strcmp c 比较 [关闭]
【发布时间】:2018-02-03 12:40:39
【问题描述】:

卡在数组和字符串与 strcmp c 比较 为什么它不起作用? 编译器卡在if(strcmp(c,ch[i]) == 0){

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char ch[]="asdfghjkl";
    char c;
    int n=sizeof(ch)/sizeof(char);
    scanf("%c",&c);
    for(int i=0;i<n;i++){
        if(strcmp(c,ch[i]) == 0){
            printf("%c is in %d\n",c,i+1);
            break;
        }else if(i==n-1){
            printf("%c not fond\n",c);
        }
    }
    return 0;
}

【问题讨论】:

  • strcmp 接受两个 字符串 作为参数。您正在传递一个 char 和一个字符串。你的编译器不抱怨吗?阅读How to debug small programs
  • strcmp 函数用于比较字符串。你想比较字符
  • c 的类型是 char(一个字符,而不是字符串)。 strcmp 需要 char *
  • 也许你应该直接比较它们? c == ch[i]
  • minimal reproducible example 说明预期结果是什么。 strchr 怎么了?

标签: c arrays if-statement char strcmp


【解决方案1】:

我相信你的编译器应该抱怨你错误地使用了strcmp:你将两个字符传递给两个const char*s,这绝对是一个UB。如果你的编译器通过抛出错误来阻止你这样做会很好。

strcmp 的原型是(在string.h 中)

int strcmp(const char * s1, const char * s2);

由于你有两个字符,char 是基本类型,你可以直接比较它们:

if ( c == ch[i] )

【讨论】:

  • 它不是“UB”,它违反了简单赋值的允许形式。将参数传递给函数时,“......参数被隐式转换,就像通过赋值一样,转换为相应参数的类型”(6.5.2.2/7)。从 charchar* 不是有效的形式。这意味着编译器必须给出诊断,否则不符合要求。
【解决方案2】:

strcmp 的声明: int strcmp(const char *s1, const char *s2);

strcmp 需要字符串,但您正在尝试传递 char。

使用

if (c == ch[i])

【讨论】:

  • 这有什么问题吗?谁能解释一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
相关资源
最近更新 更多