...在需要比较整个字符串的相同用户场景下,...
strncmp(inputString, "LiternalString", strlen("LiternalString"));
考虑字符串inputString 比字符串字面量长的情况。
const char *inputString = "LiternalString_XYZ";
int cmp = strncmp(inputString, "LiternalString", strlen("LiternalString"));
printf("%d\n", cmp); // prints 0.
但 OP 想要整个字符串进行比较。
const char *inputString = "LiternalString_XYZ";
int cmp = strcmp(inputString, "LiternalString");
printf("%d\n", cmp); // prints non-zero.
OP 直接问题的结论
我想知道这是否有意义。
没有。为了比较整个字符串,strncmp() 无法始终提供正确的结果。使用strcmp()。
进一步
strncmp(s1,s2,n) 可以限制搜索,使其不会到达不可访问的内存 如果 n 被正确计算 - 这在 OP 的代码中没有完成,并且在最佳n 与s1 和s2 不同。
n 的大小限制适用于s1 和s2,因此此函数可用于比较前缀,但不能“更安全”。
在 OP 的情况下,由于 string literal 作为 string literals 的字符串长度,没有理由因为“安全”而限制搜索总是 包含一个终止空字符。
如果有的话,n 应该基于 inputString 的某些属性。
strncmp(s1, string_literal, strlen(s1)) 之类的代码在功能上不正确,因为比较错过了 空字符。 strncmp(s1, string_literal, strlen(s1)+1) 稍微好一点,但它在功能上与更简单的 strcmp(s1, string_literal) 相同,但不会降低“安全性”。
如果foo() 没有正确形成字符串,以下提供了一些改进的“安全性”,但如果N != M 如上所述,则可以提供错误的答案。
char s1[N];
foo(s1); // populate s1 somehow
int cmp = strncmp(s1, string_literal, sizeof s1);
char s1[N];
char s2[M];
foo(s1); // populate s1 somehow
foo(s2); // populate s2 somehow
int cmp = strncmp(s1, s2, min(sizeof s1, sizeof s2));
但在这些情况下,问题出在foo(),而不是这里。
对我来说,如果foo() 如此可疑,我会使用以下
s1[sizeof s1 - 1] = '\0';
s2[sizeof s2 - 1] = '\0';
int cmp = strcmp(s1, s2);
或检测到foo() 没有形成字符串。
char s1[N];
foo(s1);
if (memchr(s1, '\0', sizeof s1) == NULL) Oops();
故事的寓意:strncmp() 不是strcmp() 的“更安全”版本。它是用于不同工作的工具:比较字符串前缀。