C++将char数组与字符串进行比较

Chr*_*eis 36 c++ string string-comparison

我正在尝试将字符数组与字符串进行比较,如下所示:

const char *var1 = " ";
var1 = getenv("myEnvVar");

if(var1 == "dev")
{
   // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这个if语句永远不会被验证为真......当我输出var1时它是"dev",我想也许它与空终止字符串有关,但是"dev"和var1的strlen是相等的...我也可能认为var1 =="dev"将"dev"与var1的内存位置进行比较而不是值.*var1 =="dev"导致错误....尝试了很多东西,可能是saavy c ++开发人员的简单解决方案(我没有在一段时间内编写c ++).

编辑:我们试过了

if(strcmp(var1, "dev") == 0)
Run Code Online (Sandbox Code Playgroud)

if(strncmp(var1, "dev", 3) == 0)
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:在家测试后,我只是建议我的同事将数据类型更改为字符串.我相信他正在将一个大字母的char数组与一个字符串进行比较.我把一个输出sizeof,strlen等的程序放在一起,以帮助我们完成它.感谢大家的帮助.

Joh*_*kin 65

使用strcmp()比较字符串的内容:

if (strcmp(var1, "dev") == 0) {
}
Run Code Online (Sandbox Code Playgroud)

说明:在C中,字符串是指向包含字节的内存位置的指针.将a char*与a char*进行比较使用等于运算符将无法正常工作,因为您要比较字符串的内存位置而不是字节内容.一个函数如strcmp()将遍历两个字符串,检查它们的字节以查看它们是否相等.strcmp()如果它们相等则返回0,如果它们不同则返回非零值.有关更多详细信息,请参见联机帮助页.

  • @Chris:你能发布一个如何使用`strcmp()`的例子吗?否则,我们不会知道它是如何"不起作用"的. (3认同)

jal*_*alf 19

你没有使用字符串.你正在使用指针. var1是一个char指针(const char*).它不是一个字符串.如果是空值终止,那么一定C功能将对待它作为一个字符串,但它是从根本上只是一个指针.

因此,当您将它与char数组进行比较时,数组也会衰减到指针,然后编译器会尝试查找operator == (const char*, const char*).

这样的运营商确实存在.它需要两个指针并返回,true如果它们指向相同的地址.所以编译器会调用它,并且你的代码会中断.

如果你想进行字符串比较,你必须告诉编译器你要处理字符串,而不是指针.

C的方法是使用该strcmp函数:

strcmp(var1, "dev");
Run Code Online (Sandbox Code Playgroud)

如果两个字符串相等,则返回零.(如果左侧按字典顺序大于右侧,则返回大于零的值,否则返回小于零的值.)

因此,为了比较平等,您需要执行以下操作之一:

if (!strcmp(var1, "dev")){...}
if (strcmp(var1, "dev") == 0) {...}
Run Code Online (Sandbox Code Playgroud)

但是,C++有一个非常有用的string类.如果我们使用它,您的代码变得更简单.当然我们可以从两个参数创建字符串,但我们只需要用其中一个来创建:

std::string var1 = getenv("myEnvVar");

if(var1 == "dev")
{
   // do stuff
}
Run Code Online (Sandbox Code Playgroud)

现在编译器遇到了string和char指针之间的比较.它可以处理它,因为char指针可以隐式转换为字符串,产生字符串/字符串比较.而那些表现完全符合您的预期.