我试图从字符串数组中获取字符串的最大长度。
我写了这段代码:
char a[100][100] = {"solol","a","1234567","123","1234"};
int max = -1;
for(int i=0;i<5;i++)
if(max<strlen(a[i]))
max=strlen(a[i]);
cout<<max;
它给出的输出是-1。 但是当我将max的值初始化为0而不是1时,代码工作正常。为什么会这样?
答案 0 :(得分:4)
函数strlen
返回无符号整数(即size_t
),因此当您将其与已签名的max
进行比较时,它会被提升为无符号且-1
转类似于0xffffffff
(实际值取决于您的体系结构/编译器),这比任何字符串都要大。
将max
类型更改为size_t
,绝不会将无符号与已签名的积分进行比较。
答案 1 :(得分:2)
size_t
是无符号整数类型。
来自C ++标准#4.6:
除bool,char16_t,char32_t或wchar_t之外的整数类型的整数转换的整数转换 如果int可以表示所有的,则rank(4.15)小于int的等级可以转换为int类型的prvalue 源类型的值;否则,源prvalue可以转换为unsigned int类型的prvalue。
max
的值为-1
,表示无符号整数类型可以容纳的最大值。在表达式max<strlen(a[i])
中,strlen
返回的值将被提升为unsigned int
,并将与无符号整数的最大值进行比较。因此,对于给定的输入,条件max<strlen(a[i])
永远不会true
,max
的值不会改变。
字符串a
数组中最长的字符串长度为7
。当您使用max
或0
初始化1
时,对于长度大于{{1的值的字符串,表达式max<strlen(a[i])
将评估为true
}}。因此,您将获得预期的输出。
答案 2 :(得分:1)
在计算表达式时,编译器会将每个表达式分解为单个子表达式。算术运算符要求它们的操作数具有相同的类型。为确保这一点,编译器使用以下规则:
如果操作数是一个比int窄的整数,则它会对int或unsigned int进行整数提升(如上所述)。 如果操作数仍然不匹配,则编译器找到最高优先级的操作数,并隐式转换另一个操作数以匹配。 操作数的优先级如下:
long double (highest) double float unsigned long long long long unsigned long long unsigned int int (lowest)
在你的情况下,操作数的类型为int,另一个类型为size_t
,因此max
被提升为类型size_t
,并且-1的位表示是最大的size_t
fsetdiff
1}}。
您可能还想查看标准[conv.prom]的以下部分, [conv.integral],[conv.rank]。
答案 3 :(得分:1)
strlen
返回unsigned int,在进行比较时-1会被提升为最大值,unsigned可以保持。
要修复代码,请将max
定义更改为unsigned int max = 0
答案 4 :(得分:0)
我认为这可能对您有用。
#include <algorithm>
const size_t ARRAYSIZE = 100;
char stringArray[ARRAYSIZE][100] = {"solol","a","1234567","123","1234"};
auto longerString = std::max_element(stringArray, stringArray + ARRAYSIZE - 1, [](const auto& s1, const auto& s2){
return strlen(s1) < strlen(s2);
});
size_t maxSize = strlen(longerString[0]);
这对我有用,返回最长的char数组,只需在“第一个元素”上划线,然后完成。对于您的示例,它返回7。
希望有帮助。