昨天在一个群里看到群友在讨论一段代码,今天有时间就分析一下:
#include <iostream>
int main(int argc, const char * argv[]) {
char s1[] = "hello";
char s2[] = {'h','e','l','l','o'};
std::cout << strcmp(s1, s2) << '\n';
return 0;
}
这段代码的本意是比较两个字符串,使用了strcmp函数,该函数用于比较两个字符串,设这两个字符串为str1,str2。若str1==str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
在这段代码中,我们很容易的会误认为s1与s2是相等的,都是hello,但实际结果与我们想象的却是不一样的。
由图我们可以看到,结果为负数,说明s1<s2,其实出现这种情况是因为我们对基础知识掌握的不透彻。
我们来看一下我们定义数组的区别:
char s1[] = “hello”;
这种方式是是用字符串常量的方式进行数组初始化的,哦们实际拿到的数组实际上是以’\0’结尾的字符数组,在内存中应该是如下方式:
只有以'\0'
结尾的字符数组才能表示字符串。
而s2的方式为:
char s2[] = {‘h’,’e’,’l’,’l’,’o’};
在实际内存中反映的情况如下:
由此我们可以发现这两种方式造成的结果反映在内存中是不一样的,而strcmp是比较字符串的函数,也就意味着在s1
到达'\0'
时就表示已经到达末尾了,而s2则不是这样子,所以导致运行的结果与我们期望的结果不同。
想要达到s1=s2的目的,我们只需要在s2的最后添加'\0'
即可。
#include <iostream>
int main(int argc, const char * argv[]) {
char s1[] = "hello";
char s2[] = {'h','e','l','l','o','\0'};
std::cout << strcmp(s1, s2) << '\n';
return 0;
}