C ++中字符串数组中最长的字符串

时间:2018-03-26 14:51:19

标签: c++ string

我试图从字符串数组中获取字符串的最大长度。

我写了这段代码:

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时,代码工作正常。为什么会这样?

5 个答案:

答案 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])永远不会truemax的值不会改变。

字符串a数组中最长的字符串长度为7。当您使用max0初始化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。

希望有帮助。