http://blog.csdn.net/vipvipvip/article/details/6337005
先看下面几个例子:
/* 定义数据 */
...
char *msg1 = "testtest";
char *msg2 = "test";
int len = 20, t = 1;
...
1-----> if( strlen(msg2) >= strlen(msg1) )... //right
2-----> if( strlen(msg2) - strlen(msg1) >= 0 )... //"error"
3-----> if( strlen(msg2) >= 10 ).... //right
4-----> if( strlen(msg2) - 10 >= 0 ).... //"error"
5-----> if( strlen(msg2) - len >= 0 )... //"error"
6-----> if( t - strlen(msg2) >= 0 )... //"error"
7-----> if( t >= strlen(msg2) )... //right
我们这里所说的"error"不是说语法上出错。语法上都没错,编译运行也都能通过。这里的"error"指的是:这条语句无法按照你预想的那样工作。2,4,5,6这四条语句的结果将永远是真。
为什么呢?
我们先看库函数 strlen 的原型吧:
size_t strlen( char const *string );
注意strlen返回一个类型为size_t的值。那么size_t是什么类型呢?这个类型是在头文件stddef.h中定义的,它是一个无符号整数类型。问题出来了,在表达式中使用无符号数可能导致不可预料的后果。
当表达式中存在有符号类型和无符号类型时,所有的操作数都自动转换为无符号类型。无符号数的运算结果绝对不可能是负的。所以,2,4,5,6这四条语句的结果将永远是真。
遇到这样的情况,你要么用1,3,7这样的形式,要么将strlen的返回值强制性转换为int。
string类型不能用strlen()求长度的,strlen只适全char *类型的.
如果要求的话得先把string类型转换成char *类型,用c_str()函数转换
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str="fjaljjfj";
int len;
len=strlen(str.c_str());
cout<<len<<endl;
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhongjiekangping/archive/2009/12/05/4947711.aspx
还有一点需要注意,看下面的说明和例子:
语法: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。 注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 比如:最好不要这样: char* c; string s="1234"; c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理 应该这样用: char c[20]; string s="1234"; strcpy(c,s.c_str()); 这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作 再举个例子 c_str() 以 char* 形式传回 string 内含字符串 如果一个函数要求char*参数,可以使用c_str()方法: string s = "Hello World!"; printf("%s", s.c_str()); //输出 "Hello World!"