这两个给定的例子有什么区别

What's the difference between these two given examples

我是 C++ 和编程本身的初学者。我只想问,这两个例子有什么区别。 “len = strlen(str1)-1”和“i = strlen(str1)-1”有什么区别

代码的顶部是这样的:

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    char str1[20],str2[20];
    int c, i ,j, len;
    
    cout<<"Enter a word: ";
    cin.getline(str1, 20);

示例 1:

//reverse
for (i = strlen(str1)-1, j = 0; i >= 0; i--, j++){
    str2[j] = str1[i];      
}
//compare string
c = strcmp(str1, str2);

/*This does not work because the value of 'c' will be -1 if the input
is "lol" which is palindrome*/

和示例 2:

//reverse
len = strlen(str1)-1;
for (i = len, j = 0; i >= 0; i--, j++){
    str2[j] = str1[i];      
}

//compare string
c = strcmp(str1, str2);

/*This does work in other hand, because of the variable "len"*/

剩下的代码就是这样

if(c == 0){
    cout<<"It is a Palindrome";
}
//if the value of C is !=0
else{
    cout<<"It is not a Palindrome";
}

}

这是为什么?提前感谢那些愿意回答的人。 :)

除了首先使用额外变量 len.

之外,两个示例都相同

这段代码实际上是反转字符串。如果 str1 包含 "123",则 str2 将包含 "321".

函数 strlen(str1) returns str1 的长度但是在数组的 C++ 索引中从 0 开始,这就是为什么最后一个元素索引将比长度小一个, 因此 strlen(str1) - 1.

更新

即使有了更新的信息,第一个问题的答案仍然相同,因为两个示例在本质上是相同的。由于下面解释的原因,结果差异是母马共同事件。

char str1[20],str2[20];

此代码创建两个 20 char 但未初始化的数组。这意味着初始值可以是随机的。

现在,当您调用 cin.getline(str1, 20); 时,它不仅会写入您输入的字符串,还会在其末尾添加终止符 '[=20=]'。我们的反转逻辑只反转字符串,但不会在 str2 的末尾插入终止符 '[=20=]',这意味着 str2 比 [= 长得多(直到找到 '[=20=]') 11=]。因此,他们永远不会正确比较。

此问题的一个简单解决方案是在使用数组之前对数组进行零填充,在 C++ 中有一种简单的方法可以做到这一点:

char str1[20] = { 0 }, str2[20] = { 0 };

如果您打算将 then 用作字符串,则对数组进行零填充始终是一个好习惯。