c,c++风格字串与strcmp
众所周知,strcmp为字串比较只用,简单的函数并不简单。
下面的代码
int main()
{
char* cp1 = {'z', 'h', 'a', 'n', 'g'};
char* cp2 = {'z', 'h', 'a', 'n', 'g'};
std::cout<<strcmp(cp1, cp2)<<std::endl;
return 0;
}
看到命名两个字符串相等,但是程序竟然输出-1;
什么原因
其实strcmp在比较过程中如果传入的是c风格的字串像下面这样
char* cp1 = "zhang";
char* cp2 = "zhang";
这是实际上比较的是两个字串的首地址,而这两个字面定义的字串都隐含着类型是const
于是他们在内存中具有相同的地址,所以即使比较两个指针的内容(两个串的地址),也会得到
正确的结果。不过仍然很惊讶,对于不同的字串系统竟然能够准确根据其大小在内存中排列
例如上面的cp1和cp2地址都是 0x0046b01c;
而char* cp2 = "zhou" 这时的cp2地址将是0x0046b04大于原来的地址。所以strcmp的比
较结果才会有这样的定义。
对于c++风格的字符数组形式如果传入的同意数组的元素地址,strcmp将比较两者地址,而
如果传入的不是同一个数组的元素地址(包括首地址),将出现不可预料结果,原因是这样的
做法并为定义!
//////////////////by xiaomi/////////////////////////////
/////////////////only for study /////////////////////////
//////////////////////////////////////////////////////////
相关文档:
高质量C++编程 Note
定义1:能长期稳定地编写出高质量程序的程序员称为编程老手。
定义2:能长期稳定地编写出高难度、高质量程序的程序员称为编程高手。
版权和版本的声明位于头文件和定义文件的开头 ,主要内容有:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
......
http://blog.csdn.net/utopia2006/archive/2008/05/30/2495667.aspx
目的:当程序在前台运行时,按挂机键程序不退出,只是退到后台运行,程序在后台运行时,按c键能把程序结束
方法:在HandleWsEventL()中屏蔽挂机键KAknUidValueEndKeyCloseEvent,在值在avkon.hrh中定义,实践中发现8.0sdk的avkon.hrh没有定义KAknUidValu ......
1、C/C++程序员请注意,不能在case语句不为空时“向下执行”。
2、值类型和引用类型之间的区别:C#的基本类型(int,char等)都是值类型,是在栈中创建的。而对象是引用类型,创建于堆中,需要使用关键字new。
3、在C#中通过实例访问静态方法或成员变量是不合法的,会生成编译器错误。但是我们可以通过声明他们 ......
void myprintf(const char *format, ...)
{
va_list arglist;
va_start(arglist, format);
vprintf(format, arglist); // or some other operation
va_end(arglist);
}
NAME
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - formatt ......