2009-01-15 49 views
13

我们都知道问题溢出可能导致,这就是为什么strn *存在 - 并且大多数时候它们是有意义的。然而,我所看到的,它使用的strncmp比较喜欢这样的命令行参数的代码:我正确地认为strcmp与文字是等价的(并且安全)吗?

现在,我会认为这是不必要的,甚至是危险的(更长的参数,将很容易计数错误的字符字面)。

strncmp在空值处停止,并且代码已经假定argv [i]以空终止。任何字符串文字都保证以null结尾,所以为什么不使用strcmp?

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

回答

16

是的,它是完全安全的,被认为是标准做法。字符串文字是保证被正确地空终止。

1

据我所知,你是绝对正确的 - 没有理由使用strncmp而不是strcmp。也许人们只是过于谨慎(不一定是坏事)。

0

是的,文字的存在限制了比较数据的大小与文字的大小。 stncmp在这里是多余的。

有些人可能会说strncmp是一个很好的习惯,但这个问题已经超过了计算字符的麻烦。

0

,我可能会用C这样的事情(如果我使用STRNCMP很多&不想做字符计数):

if(... strncmp(argv[i], "--help", sizeof("--help") - 1) == 0 
+0

但遍历字符串不必要的两倍。至少使用(sizeof(“ - help”) - 1)。是的,sizeof在字符串文字上正确工作,因为它们的大小在编译时已知。 – 2009-01-15 21:47:10

+0

另外,不,strlen不计数null。 – 2009-01-15 21:48:13

+0

我不确定字符串文字的大小。一般来说,我会建议C++和std :: string。 :-) – 2009-01-15 21:57:24

0

它可能不适合做安全。它可能已经完成,只检查命令行参数的开始。许多程序只是检查命令行开关的开始,忽略其余部分。

4

你说得对。此外,您提供的示例将匹配“--help”,但也包含以“--help”开头的所有内容(如“--help-me”)。

一个罕见的情况,其中过度==错误。

12

您确定该代码无意匹配 "--helpmedosoemthingwithareallylongoptionname"

1

正如其他人所说,strcmp()是完全安全的使用文字。如果你想使用strncmp(),试试这个:

strncmp(argv[i], "--help", sizeof("--help")) 

让编译器为你做计数!

这只会匹配确切的字符串“--help”。如果您想匹配以"--help"开头的所有字符串(如您的代码所做的那样),请使用sizeof() - 1不包含最后的'\0'

0

呃...从技术上来说不能这样的事情发生?

char *cp1 = "help"; 
cp1[4] = '!'; // BAD PRACTICE! don't try to mutate a string constant! 
// Especially if you remove the terminating null! 
    ... 
strcmp(some_variable, "help"); 
// if compiler is "smart" enough to use the same memory to implement 
// both instances of "help", you are screwed... 

我想这是一个病态的情况下,和/或垃圾进,垃圾出(“文件,它伤害时,我捶我的头撞墙!”“那就不要做了!”)。 ..

(PS我只是提出这个问题 - 如果你觉得这个职位muddies水域,评论适当&我会删除它)

相关问题