先看下面几个例子:
/* 定义数据 */
...
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;
}