c - strcasecmp 或 tolower/toupper + strcmp 哪个更好?

标签 c

我有一些代码在一个函数中大量使用 strcasecmp(参见版本 1)。所以我想知道我是否应该将它更改为大写或小写和 strcmp(如版本 2)以兼容 c 并具有更好的性能,因为我只需要将其转换为大写- 或者小写一次。

char pname[5]="TEST";
//version 1
if(strcasecmp(pname,"TEST")==0)
{
  printf("%s\n", pname);
}
//version 2
for(int i=0;i<5;++i)
{
    pname[i]=toupper(pname[i]);
}
if(strcmp(pname,"TEST")==0)
{
    printf("%s\n", pname);
}

最佳答案

我假设更好,你的意思是,更好的性能,即更少的操作。

假设:

x = time of tolower()/toupper()

n = time of string[n] operation

还有

best case (quickest time to complete) = no match

worst case (longest time to complete) = string match

这些计算假设我们只需要降低/提升一个字符串,如您的代码所示

版本 1:(strcasecmp)

best case = 1 + x [i.e. one operation on to lower/upper on first character - no match]

worst case = n + (x * n) [i.e. n operations of to lower/upper - string match]

-- average = (n*(x+1) + x + 1)/2

版本 2(tolower/upper + strcmp)

best case = 1 + (x * n) [i.e. n operations of to lower/upper on all character - no match]

worst case = n [i.e. n operations on all characters]

-- average = (1 + n*(x+1)) / 2

结论

所以与版本 2 的不同之处在于,它改进了最坏的情况,但这样做却使最好的情况变得更糟。然而,在一般情况下,版本 2 更快。

即如果您像之前的版本 2 一样将整个字符串更改为大写或小写,那么您必须已经遍历字符串中的每个字符,这可能不需要,因为字符串可能根本不匹配,添加额外的操作不需要。

此外,根据您使用的编译器,使用索引的 for 循环不是特别快,您可以更快:

   while (*chptr)
   {
      // do stuff with *chptr
      chptr++;
   }

对于字符串。

关于c - strcasecmp 或 tolower/toupper + strcmp 哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51418990/

相关文章:

c - C 递归子程序中释放内存

c - 不兼容的类型分配

java - 如何正确初始化 JNA 中 `Structure` 内的数组字段?

c - 构建正则表达式以使用 regcomp 进行编译时遇到问题

java - 可下载应用程序中的不同语言

c - 即使未指定返回变量或值,C 编译器如何能够准确地猜测应该返回哪个值?

c - 如何在 C 中将 token 字符中的值设置为名为 customerData[][] 的数组?

c - C中的结构类型

C - 比较并将 char* 转换为 char

计算文本文件中的字符使用情况? C