标签: strcmp

为什么模板函数中的 strcmp() 返回不同的值?

我正在再次阅读“C++ Primer,第 5 版”。在关于模板的第16章中,有一个“模板非类型参数”的例子:

template<unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M])
{
    return strcmp(p1, p2);
}

int main()
{

    cout << compare("hi", "mom") << endl;
    cout << strcmp("hi", "mom") << endl;


    std::cout << "\ndone!\n";
}
Run Code Online (Sandbox Code Playgroud)
  • 众所周知,strcmp()比较两个字符串并返回0相等,如果str1大于则为str2正值,如果str1小于则为负值str2,这就是我在main()调用strcmp().

  • 问题出在调用strcmp()模板函数内部的书中示例中,所以当我运行程序时,我得到:

输出:

-5
-1
Run Code Online (Sandbox Code Playgroud)

代码中有什么问题?为什么两者对相同的参数给出不同的值?

c++ templates strcmp non-type

20
推荐指数
1
解决办法
711
查看次数

我是否正确strcmp与文字相同(且安全)?

我们都知道溢出可能导致的问题,这就是strn*存在的原因 - 而且大部分时间它们都有意义.但是,我见过使用strncmp比较命令行参数的代码,如下所示:

if(... strncmp(argv[i], "--help", 6) == 0
Run Code Online (Sandbox Code Playgroud)

现在,我认为这是不必要的,甚至可能是危险的(对于更长的参数,很容易错误计算文字中的字符).

strncmp在空值上停止,代码已经假设argv [i]以空值终止.任何字符串文字都保证以null结尾,那么为什么不使用strcmp呢?

也许我错过了一些东西,但我已经看过几次了,而这一次它引起了我的兴趣.

c strcmp

15
推荐指数
3
解决办法
1万
查看次数

strcmp行为

当我运行以下代码时:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    p = strcmp(NULL,"foo");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到分段错误.回声$?139.但是当我跑的时候

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    strcmp(NULL,"foo"); // Note removed assignment

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我没有任何分段错误.有人可以请一些光吗?

这是我的gcc信息:

> gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8)
Run Code Online (Sandbox Code Playgroud)

c string strcmp

14
推荐指数
2
解决办法
2万
查看次数

有没有安全的strcmp?

我做了这样的功能:

bool IsSameString(char* p1, char* p2) 
{
     return 0 == strcmp(p1, p2);
}
Run Code Online (Sandbox Code Playgroud)

问题是,有时,错误地传递了不是字符串的参数(意味着p1p2不以空字符终止).然后,strcmp继续比较,直到它到达不可访问的内存并崩溃.有安全版strcmp吗?或者我能否以安全的方式判断p1(和p2)是否为字符串?

c c++ strcmp

12
推荐指数
4
解决办法
3万
查看次数

为什么"echo strcmp('60','100');" 在PHP输出5?

关于这个函数的PHP文档有点稀疏,我已经读过这个函数比较ASCII值所以......

echo strcmp('hello', 'hello');
//outputs 0 as expected - strings are equal.
echo '<hr />';

echo strcmp('Hello', 'hello');
//outputs -32, a negative number is expected as 
//uppercase H has a lower ASCII value than lowercase h.
echo '<hr />';

echo strcmp('60', '100');
//outputs 5.
Run Code Online (Sandbox Code Playgroud)

最后一个例子令我感到困惑.我不明白为什么输出正数.

  • ASCII值0 = 48
  • ASCII值1 = 49
  • ASCII值6 = 54

  • 总ASCII值'60'=(54 + 48)= 102

  • 总ASCII值'100'=(49 + 48 + 48)= 145

strcmp()函数表示'60'比'100'"更大",即使看起来ASCII值字符串长度'100'大于'60'

有谁能解释为什么?

谢谢

php strcmp

12
推荐指数
3
解决办法
493
查看次数

为什么strcmp不知道铿锵?

我有一个比较两个字符串的基本程序:

#include <string>
#include <iostream>

using namespace std;

int main (int argc, char *argv[]) {
  if(strcmp (argv[0],"./test") != 0) {
    cout << "not equal" << endl;
  } else {
    cout << "equal" << endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它用gcc编译但不用clang编译:

 > clang -o test test_clang.cpp 
test_clang.cpp:7:6: error: use of undeclared identifier 'strcmp'
  if(strcmp (argv[0],"./test") != 0) {
     ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

为什么不用clang编译?

编辑:人们对堆栈溢出越来越苛刻,直到我不愿意发布一个问题.上面的问题有一个简单的答案,很好,但是向下投票问题是正常的(在第一分钟两次!),因为他们有一个简单但不明显的答案?

c++ clang strcmp

12
推荐指数
3
解决办法
7521
查看次数

高效的字符串排序算法

通过比较对字符串进行排序(例如标准的QuickSort +类似strcmp的函数)可能有点慢,特别是对于共享公共前缀的长字符串(比较函数需要O(s)时间,其中s是字符串的长度),因此a标准解决方案具有O(s*nlog n)的复杂性.有没有更快的算法?

sorting string algorithm quicksort strcmp

11
推荐指数
2
解决办法
2万
查看次数

Option Strict On禁止后期绑定

有人可以帮我解决这个错误吗?

Option Strict On禁止后期绑定

这是导致错误的代码:

Dim SF6StdData As BindingSource = New BindingSource() 
' ...
If StrComp(SF6StdData.Current("O2AreaCts").ToString, "") = 0 Then
    AreaCts(3) = 0
Else
    AreaCts(3) = Convert.ToDouble(SF6StdData.Current("O2AreaCts").ToString)
End If
Run Code Online (Sandbox Code Playgroud)

我需要重写代码,这样就不会有任何错误.我知道我可以通过在项目属性中将Option Strict设置为Off来解决这个问题,但我真的不想这样做.还有其他方法吗?

vb.net visual-studio-2010 strcmp

11
推荐指数
1
解决办法
3万
查看次数

优化的strcmp实现

这个功能在这里找到.这是一个实现strcmp:

int strcmp(const char* s1, const char* s2)
{
    while (*s1 && (*s1 == *s2))
        s1++, s2++;
    return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
Run Code Online (Sandbox Code Playgroud)

我理解除了最后一行之外的所有内容,简言之,最后一行是怎么回事?

c string-comparison strcmp

11
推荐指数
1
解决办法
2万
查看次数

带有strcmp的Segfault

我在以下方面使用strcmp

  1. 传递char []数组名称
  2. 将指针传递给字符串文字,但第二个结果是seg错误.即使我已经确认指针指向正确的字符串文字,我很困惑为什么我得到seg错误..这是代码: -

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char const *args[])
    {
      char firstName[strlen(*++args)];
      strcpy(firstName, *args);
      char lastName[strlen(*++args)];
      strcpy(lastName, *args);
      printf("%s\t%s\n", firstName, lastName);
    
      printf("%d\n", strcmp(firstName, lastName));// this works
    
      printf("%d\n", strcmp(*(--args),*(++args)));//this gives me a seg fault
    
      return EXIT_SUCCESS;
    }
    
    Run Code Online (Sandbox Code Playgroud)

我将它保存为str.c,当我编译它时,首先我得到以下警告:

[Neutron@Discovery examples]$ gcc -Wall str.c -o str

str.c: In function ‘main’:
str.c:15: warning: operation on ‘args’ may be undefined
Run Code Online (Sandbox Code Playgroud)

最后运行它,给出一个seg错误,如下所示

[Neutron@Discovery examples]$ ./str Jimmy Neutron


Jimmy   Neutron

-4

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

c evaluation args strcmp sequence-points

10
推荐指数
2
解决办法
2033
查看次数