我期待“匹配!”当 n2
尾部与 n1
尾部相同时,否则,“不匹配!”。
“匹配!”示例:n1 = 123456
和 n2 = 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
正在45
和 n2
正在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/