c++ - C 字符串的奇怪结果

标签 c++ string strlen

我期待“匹配!”当 n2 尾部与 n1 尾部相同时,否则,“不匹配!”。 “匹配!”示例:n1 = 123456n2 = 3456

例如,当我输入 n1 = "45"n2 = "645" 时出现问题。它不应该匹配,但输出是“匹配!”。

bool different_tail = false;

char n1[11], n2[11];

cin >> n1 >> n2;

for(int i = strlen(n1)-strlen(n2); i < strlen(n1); i++){
  if(i < 0 || n1[i] != n2[i-(strlen(n1)-strlen(n2))]){
    different_tail = true;
    break;
  }
}

if(different_tail)
  cout << "does not match!" << endl;
else
  cout << "match!" << endl;

我不想使用其他方法来解决问题(例如,strcmp 等...),我想了解发生了什么。

最佳答案

发生的事情是 n1正在45n2正在645 , 循环变量 i将从 -1 开始, 即为负数。

然而, strlen 产生一个无符号值(类型为 size_t 的值)。将有符号值与无符号值进行比较时(如在表达式 i < strlen(n1) 中所做的那样),有符号值将转换为无符号值。因为它是负数,所以会导致下溢,所以 i是一个非常大的值 -- 大于 strlen(n1) .

你可以观察到相同的效果,例如

int i = -1;
size_t x = 5;
if (i < x) {
  cout << "yes\n";
} else {
  cout << "no\n";
}

这个程序打印no .

您可以通过转换 strlen 的返回值来避免您的问题,即将循环条件更改为

i < static_cast<int>(strlen(n1))

This question (以及随附的答案)提供了对该主题的更深入讨论。

关于c++ - C 字符串的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767543/

相关文章:

c++ - 引用变量是否在堆栈中占用内存?

cocoa - 在 Cocoa 中构建字符串时使用单引号

c# - 如何评估此字符串串联?

c - "Segmentation Fault (core dumped)"是什么?为什么它会在我的输出中返回?

c++ - 具有重叠固定相机的 OpenCV Stitcher 类

C++ 转换运算符错误?

c - 为什么 -1>strlen(t) 在 C 中为真?

c - 单个字符的 Strlen 函数行为

c++ - 在类似函数的宏中添加预处理器指令是否错误?

c++ - 在 C++ 中拆分字符串的更快方法