我正在再次阅读“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)
代码中有什么问题?为什么两者对相同的参数给出不同的值?
我们都知道溢出可能导致的问题,这就是strn*存在的原因 - 而且大部分时间它们都有意义.但是,我见过使用strncmp比较命令行参数的代码,如下所示:
if(... strncmp(argv[i], "--help", 6) == 0
Run Code Online (Sandbox Code Playgroud)
现在,我认为这是不必要的,甚至可能是危险的(对于更长的参数,很容易错误计算文字中的字符).
strncmp在空值上停止,代码已经假设argv [i]以空值终止.任何字符串文字都保证以null结尾,那么为什么不使用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) 我做了这样的功能:
bool IsSameString(char* p1, char* p2)
{
return 0 == strcmp(p1, p2);
}
Run Code Online (Sandbox Code Playgroud)
问题是,有时,错误地传递了不是字符串的参数(意味着p1或p2不以空字符终止).然后,strcmp继续比较,直到它到达不可访问的内存并崩溃.有安全版strcmp吗?或者我能否以安全的方式判断p1(和p2)是否为字符串?
关于这个函数的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值6 = 54
总ASCII值'60'=(54 + 48)= 102
strcmp()函数表示'60'比'100'"更大",即使看起来ASCII值和字符串长度'100'大于'60'
有谁能解释为什么?
谢谢
我有一个比较两个字符串的基本程序:
#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编译?
编辑:人们对堆栈溢出越来越苛刻,直到我不愿意发布一个问题.上面的问题有一个简单的答案,很好,但是向下投票问题是正常的(在第一分钟两次!),因为他们有一个简单但不明显的答案?
通过比较对字符串进行排序(例如标准的QuickSort +类似strcmp的函数)可能有点慢,特别是对于共享公共前缀的长字符串(比较函数需要O(s)时间,其中s是字符串的长度),因此a标准解决方案具有O(s*nlog n)的复杂性.有没有更快的算法?
有人可以帮我解决这个错误吗?
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来解决这个问题,但我真的不想这样做.还有其他方法吗?
这个功能在这里找到.这是一个实现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)
我理解除了最后一行之外的所有内容,简言之,最后一行是怎么回事?
我在以下方面使用strcmp
将指针传递给字符串文字,但第二个结果是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)