[英]C++ Compare char array with string
我正在尝试将字符数组与字符串进行比较,如下所示:
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 等的程序来帮助我们解决它。 感谢大家的帮助。
你不是在处理字符串。 您正在使用指针。 var1
是一个字符指针( const char*
)。 它不是一个字符串。 如果是空值终止,那么某些C函数将把它作为一个字符串,但它是从根本上只是一个指针。
因此,当您将它与 char 数组进行比较时,该数组也会衰减为一个指针,然后编译器会尝试找到一个operator == (const char*, const char*)
。
这样的运营商确实存在。 它需要两个指针,如果它们指向同一个地址,则返回true
。 所以编译器调用它,你的代码就会中断。
如果要进行字符串比较,则必须告诉编译器您要处理字符串,而不是指针。
这样做的 C 方法是使用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
}
现在编译器遇到字符串和字符指针之间的比较。 它可以处理这种情况,因为字符指针可以隐式转换为字符串,从而产生字符串/字符串比较。 这些行为完全符合您的预期。
在此代码中,您不是在比较字符串值,而是在比较指针值。 如果要比较字符串值,则需要使用字符串比较函数,例如 strcmp。
if ( 0 == strcmp(var1, "dev")) {
..
}
"dev" 不是string
而是像var1
一样的const char *
。 因此,您确实在比较内存地址。 由于var1
是一个字符指针, *var1
是单个字符(准确地说是指向字符序列的第一个字符)。 您不能将 char 与 char 指针进行比较,这就是为什么它不起作用。
由于这被标记为 c++,因此使用std::string
而不是 char 指针是明智的,这将使 == 按预期工作。 (您只需要执行const std::string var1
而不是const char *var1
。
有更稳定的功能,也摆脱了字符串折叠。
// 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;
}
}
并在标题中添加声明
// Parameters use 'const' for prevent possible object corruption.
bool string_equal (const char* arg0, const char* arg1);
对于用法,只需放置一个 'string_equal' 调用作为 if(或三元)语句/块的条件。
if (string_equal (var1, "dev"))
{
// It is equal, do what needed here.
}
else
{
// It is not equal, do what needed here (optional).
}
来源:sinatramultimedia/fl32 codec(我自己写的)
你对下面这个程序的想法
#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
当您应该考虑将某些内容输入数组然后使用 strcmp 函数(如上面的程序)时……查看下面的修改后的程序
#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;
}
更改为字符串,除了它只读取 1 个输入并抛出其余的可能需要两个 for 循环和两个指针
#include <cstring>
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
char name[100];
//string userInput[26];
int i=0, n=0, m=0;
cout<<"your name? ";
cin>>name;
cout<<"Hello "<<name<< endl;
char *ptr=name;
for (i = 0; i < 20; i++)
{
cout<<i<<" "<<ptr[i]<<" "<<(int)ptr[i]<<endl;
}
int length = 0;
while(name[length] != '\0')
{
length++;
}
for(n=0; n<4; n++)
{
if (strncmp(ptr, "snit", 4) == 0)
{
cout << "you found the snitch " << ptr[i];
}
}
cout<<name <<"is"<<length<<"chars long";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.