这两个给定的例子有什么区别
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 用作字符串,则对数组进行零填充始终是一个好习惯。
我是 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 用作字符串,则对数组进行零填充始终是一个好习惯。