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

时间:2009-08-25 19:51:10

标签: c++ string string-comparison

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

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等的程序放在一起,以帮助我们完成它。感谢大家的帮助。

6 个答案:

答案 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;
}