我正在尝试将字符数组与字符串进行比较,如下所示:
const char *var1 = " ";
var1 = getenv("myEnvVar");
if(var1 == "dev")
{
// do stuff
}
这个if语句永远不会被验证为真......当我输出var1时它是“dev”,我想也许它与空终止字符串有关,但是“dev”和var1的strlen是相等的。 ..我还想也许var1 ==“dev”将“dev”与var1的内存位置进行比较而不是值。 * var1 ==“dev”导致错误....尝试了很多东西,对于saavy c ++开发人员来说可能是一个简单的解决方案(我没有在很长的时间内编写c ++)。
编辑: 我们试过了
if(strcmp(var1, "dev") == 0)
和
if(strncmp(var1, "dev", 3) == 0)
由于
编辑:在家测试之后,我只是建议我的同事将数据类型更改为字符串。我相信他正在将一个大字母的char数组与一个字符串进行比较。我把一个输出sizeof,strlen等的程序放在一起,以帮助我们完成它。感谢大家的帮助。
答案 0 :(得分:64)
使用strcmp()
比较字符串的内容:
if (strcmp(var1, "dev") == 0) {
}
说明:在C中,字符串是指向包含字节的内存位置的指针。使用相等运算符将char*
与char*
进行比较将无法正常工作,因为您要比较字符串的内存位置而不是字节内容。诸如strcmp()
之类的函数将遍历两个字符串,检查它们的字节以查看它们是否相等。 strcmp()
如果相等则返回0,如果不相等则返回非零值。有关详细信息,请参阅manpage。
答案 1 :(得分:18)
你没有使用字符串。你正在使用指针。
var1
是一个char指针(const char*
)。它不是一个字符串。如果它以null结尾,那么某些C函数将将视为字符串,但它基本上只是一个指针。
因此,当您将它与char数组进行比较时,数组也会衰减为指针,然后编译器会尝试查找operator == (const char*, const char*)
。
这样的运营商确实存在。它需要两个指针并返回true
,如果它们指向相同的地址。所以编译器会调用它,并且你的代码会中断。
如果你想进行字符串比较,你必须告诉编译器你要处理字符串,而不是指针。
这样做的方法是使用strcmp
函数:
strcmp(var1, "dev");
如果两个字符串相等,则返回零。 (如果左侧按字典顺序大于右侧,则返回大于零的值,否则返回小于零的值。)
为了比较平等,你需要做以下其中一个:
if (!strcmp(var1, "dev")){...}
if (strcmp(var1, "dev") == 0) {...}
但是,C ++有一个非常有用的string
类。如果我们使用它,您的代码变得更简单。当然我们可以从两个参数创建字符串,但我们只需要用其中一个来完成:
std::string var1 = getenv("myEnvVar");
if(var1 == "dev")
{
// do stuff
}
现在编译器遇到了string和char指针之间的比较。它可以处理它,因为char指针可以隐式转换为字符串,产生字符串/字符串比较。而那些行为完全符合您的预期。
答案 2 :(得分:1)
在此代码中,您不是在比较字符串值,而是在比较指针值。如果要比较字符串值,则需要使用字符串比较函数,例如strcmp。
if ( 0 == strcmp(var1, "dev")) {
..
}
答案 3 :(得分:0)
“dev”不是string
,而是const char *
,如var1
。因此,您确实在比较记忆地址。由于var1
是一个char指针,*var1
是一个char(准确指向字符序列的第一个字符)。你不能将char与char指针进行比较,这就是为什么它不起作用。
由于这被标记为c ++,因此使用std::string
代替char指针是明智的,这会使==按预期工作。 (您只需要const std::string var1
代替const char *var1
。
答案 4 :(得分:0)
有更稳定的功能,也摆脱了字符串折叠。
id_token
并向标题
添加声明// Add to C++ source
bool string_equal (const char* arg0, const char* arg1)
{
/*
* This function wraps string comparison with string pointers
* (and also works around 'string folding', as I said).
* Converts pointers to std::string
* for make use of string equality operator (==).
* Parameters use 'const' for prevent possible object corruption.
*/
std::string var0 = (std::string) arg0;
std::string var1 = (std::string) arg1;
if (var0 == var1)
{
return true;
}
else
{
return false;
}
}
对于用法,只需将'string_equal'调用作为if(或三元)语句/块的条件。
// Parameters use 'const' for prevent possible object corruption.
bool string_equal (const char* arg0, const char* arg1);
来源:sinatramultimedia / fl32编解码器(由我自己编写)
答案 5 :(得分:0)
您对下面这个计划的看法
var name=$('#last').val();
当你应该考虑将某些东西输入数组时然后使用strcmp函数,如上面的程序...查看下面的修改程序
#include <stdio.h>
#include <string.h>
int main ()
{
char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
int n;
puts ("Looking for R2 astromech droids...");
for (n=0 ; n<3 ; n++)
if (strncmp (str[n],"R2xx",2) == 0)
{
printf ("found %s\n",str[n]);
}
return 0;
}
//outputs:
//
//Looking for R2 astromech droids...
//found R2D2
//found R2A6
更改为字符串,但它只读取1个输入并将其余部分抛出 也许需要两个for循环和两个指针
#include <iostream>
#include<cctype>
#include <string.h>
#include <string>
using namespace std;
int main()
{
int Students=2;
int Projects=3, Avg2=0, Sum2=0, SumT2=0, AvgT2=0, i=0, j=0;
int Grades[Students][Projects];
for(int j=0; j<=Projects-1; j++){
for(int i=0; i<=Students; i++) {
cout <<"Please give grade of student "<< j <<"in project "<< i << ":";
cin >> Grades[j][i];
}
Sum2 = Sum2 + Grades[i][j];
Avg2 = Sum2/Students;
}
SumT2 = SumT2 + Avg2;
AvgT2 = SumT2/Projects;
cout << "avg is : " << AvgT2 << " and sum : " << SumT2 << ":";
return 0;
}