Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用相等运算符==在C中比较两个字符串是否相等 #./myProg-你好 假的_C_String_Pointers_Equality_Equality Operator - Fatal编程技术网

使用相等运算符==在C中比较两个字符串是否相等 #./myProg-你好 假的

使用相等运算符==在C中比较两个字符串是否相等 #./myProg-你好 假的,c,string,pointers,equality,equality-operator,C,String,Pointers,Equality,Equality Operator,为什么??我意识到strcmp(argv[1],“-hello”)==0返回true。。。但是为什么我不能使用相等运算符来比较两个C字符串呢?因为argv[1](例如)实际上是一个指向字符串的指针。所以你所做的就是比较指针。因为没有C字符串这样的东西 在C语言中,字符串通常是字符数组,或者是指向字符的指针(几乎相同)。将指针/数组与常量数组进行比较不会得到预期的结果 更新:我所说的“无C字符串”的意思是,C中没有字符串。通常称为“C字符串”的是独立于语言的(就像“Pascal字符串”一样),它是

为什么??我意识到strcmp(argv[1],“-hello”)==0返回true。。。但是为什么我不能使用相等运算符来比较两个C字符串呢?

因为
argv[1]
(例如)实际上是一个指向字符串的指针。所以你所做的就是比较指针。

因为没有C字符串这样的东西

在C语言中,字符串通常是字符数组,或者是指向字符的指针(几乎相同)。将指针/数组与常量数组进行比较不会得到预期的结果


更新:我所说的“无C字符串”的意思是,C中没有字符串。通常称为“C字符串”的是独立于语言的(就像“Pascal字符串”一样),它是字符串作为以空结尾的字符线性数组的表示。

因为C字符串本身并不存在。它们是以
\0
结尾的字符数组

相等运算符
==
将测试指向数组第一个元素的指针是否相同。它不会按字典进行比较

另一方面,
“-hello”==“-hello”
可能返回非零,但这并不意味着
==
操作符会按字典进行比较。那是由于其他事实

如果你想用词典进行比较,你可以

# ./myProg -hello False 阅读更难,我看到你标记为C++。所以你可以

#define STR_EQ(s1,s2)    \
   strcmp(s1,s2) == 0

因为C字符串是字符数组。数组只是指向数组中第一个元素的指针,当您使用==比较两个指针时,它比较的是它们指向的内存地址,而不是它们指向的值。

字符串在C中不是本机类型。在该示例中比较的是两个指针。一个是第一个参数,另一个是包含“-hello”内容的静态字符数组


您确实想使用strncmp或类似的东西。

您不能将C中的字符串与==进行比较,因为C编译器对字符串文字以外的字符串没有任何线索


编译器会在两侧看到与
char*
的比较,因此它会进行指针比较(比较指针中存储的地址)

当使用==时,您会比较指针。也就是说,如果两个操作数引用内存中的同一字符串,则返回true。因此,它不适合用于按字典顺序比较字符串。

C
中,因为在大多数上下文中,数组“衰减为指向其第一个元素的指针”

因此,当您拥有数组
“foobar”
并在大多数上下文中使用它时,它会衰减为指针:

 std::string arg1 ( argv[1] );

 if (arg1 == "-hello"){
    // yeahh!!!
 }
 else{
    //awwwww
 }
您希望它将数组的内容与其他内容进行比较。您可以手动执行此操作

if (name == "foobar") /* ... */; /* comparing name with a pointer */
或者自动地

if ('p' == *("foobar")) /* ... */; /* false: 'p' != 'f' */
if ('m' == *("foobar"+1)) /* ... */; /* false: 'm' != 'o' */
if ('g' == *("foobar"+2)) /* ... */; /* false: 'g' != 'o' */
在C语言中,字符串值(包括字符串文字)表示为
char
后跟0终止符的数组,并且不能使用
=
操作符来比较数组内容;该语言只是没有定义操作

除非它是
sizeof
&
运算符的操作数,或者是用于初始化声明中另一个数组的字符串文字,否则类型为“N-element array of T”的表达式将其类型隐式转换(衰减)为类型“pointer to T”,表达式的值将是数组第一个元素的地址

所以当你写作的时候

if (strcmp(name, "foobar")) /* name is not "foobar" */;
编译器将表达式
“-hello”
从类型“7元素字符数组”隐式转换为“指向字符的指针”(
argv[1]
已经是指针类型),表达式的值是字符
'-'
的地址。因此,
==
最后比较的是两个指针值,它们(很可能)永远不会相等,因为
“-hello”
argv[1]
(很可能)占据内存中的不同区域


这就是为什么必须使用库函数(如
strcmp()
)来比较字符串值

,sheesh.@detly:考虑到数组几乎可以以任何借口退化为指针,很容易犯错误。@David Thornley:即便如此,最好还是把术语弄对。C已经够让人困惑的了,但基本上没有弄错。我的措辞有点苛刻,对不起。但事实并非如此。有些时候,这个假设会真正地伤害你。有人把标签编辑成C++,这是错误的。现在又回到C了,肯定有一种东西叫做a。我不知道你到底是什么意思。也许“C语言中没有C字符串类型”?这只是滥用了这个术语。这里描述的是一个空的终止字符串,而不是一个“Pascal String”,它将大小作为第一个字节。现在,C编程语言(如没有STL的香草C++)没有字符串类型。有一种编译器功能,可以自动将双引号“…”之间的文本转换为常量字符数组(以null结尾),从而导致在C/C++中处理字符串时出现这一常见错误。还有一些字符串库函数,可以在以null结尾的
字符数组上操作。更恰当地说,字符串值由后跟0终止符的字符序列表示。这些序列被存储为 char 数组(字符串文字存储在C中的代码< CARR < /COD> > C中, const char < /C> > C++中。由于您坚持问题是C问题,所以我用C代码替换了C++代码。如果你坚持STD::CUT,我坚持C++标签。这个问题肯定是一个精确的复制。<代码>如果(StrucMP(name,FoBar))如果字符串是等价的,则它会被评估为false,因为它在那个情况下返回0。代码>如果(strcmp(名称,“foobar”)==0)
将更好地感谢@Overdrivr的提醒。在C语言中,字符串值(包括字符串文字)表示为if (strcmp(name, "foobar")) /* name is not "foobar" */;
if (argv[1] == "-hello")