如何在 C++ 中将字符串分配给 unsigned char[]
How to assign string to unsigned char[] in c++
我很难理解类型转换,我试图通过将 string
的内容分配给 unsigned chars
的数组来提高我的理解力。我希望下面的代码打印 true
,但事实并非如此。
unsigned char a[10]={0,1,2,3,4,5,6,7,8,9};
string b="5";
if(a[5]==(unsigned char)atoi(b.c_str())){
cout<<true<<endl;
}
我错过了什么?
如果您确定您的字符串 b
恰好有一个字符:
char c = b[0];
就是这样。
atoi
不提取字符,而是将数字内容解析为整数。
或许转换成字符串比较好:
#include <iostream>
#include <string>
int main() {
unsigned char a[10]={0,1,2,3,4,5,6,7,8,9};
std::string b="5";
std::cout<<std::boolalpha<<(std::to_string(a[4])==b)<<std::endl;
std::cout<<std::boolalpha<<(std::to_string(a[5])==b)<<std::endl;
return 0;
}
如果您尝试打印 true
,您的示例代码有一个或多个问题。有多少取决于你如何尝试做到这一点。 如果您将文本与其他文本进行比较,我的前两点适用。如果您尝试将文本转换为数字并比较数字,请忽略它们。
unsigned char a[10]={0,1,2,3,4,5,6,7,8,9}; // 1
string b="5";
if(a[5]==(unsigned char)atoi(b.c_str())){ // 2
count<<true<<endl; // 3
}
1) 虽然这会生成一个无符号字符数组,但它们不是文本值。该数组中的值是前 10 个 ASCII characters,而不是打印时产生“0”到“9”的字符。这些字符可以用代码放在你的数组中:
unsigned char a[10]={'0','1','2','3','4','5','6','7','8','9'};
同样,这仅适用于您尝试比较文本数据的情况。如果您尝试转换为数字并将此数组中的条目与该数字进行比较,您将需要原始数组。
2) a[5]
将访问 a
的第六个元素是正确的。如果要比较文本值而不是数值,则只需访问字符串的第一个元素进行比较。 前提是您知道该字符串的大小至少为 1 个元素。因为您是在这段代码的上方定义它的,所以没问题,但是在用户输入的情况下,您需要检查.这种比较的正确语法,再次如 deviantfan 所述,是 a[5] == b[0]
,因为 strings
上的 []
运算符将 return 一个 char
.
再次重申,以上内容仅在您比较文本值时才适用于您的答案。如果您比较的是数值,那么您的原始代码是正确的。
3) 您没有在 true
两边加上引号。虽然这会编译,甚至打印一些东西——但它不会是 true
,除非满足一些你在编码生涯早期不太可能遇到的条件。您可能想要输入的是 "true",这将使输出打印为真。此外,您想要 cout
,而不是 count
。
这是一个 link 示例,该示例将字符串和(修改后的)字符数组作为文本数据进行比较。如果您正在比较数字数据,那么您的代码唯一的错误是 3)。
我很难理解类型转换,我试图通过将 string
的内容分配给 unsigned chars
的数组来提高我的理解力。我希望下面的代码打印 true
,但事实并非如此。
unsigned char a[10]={0,1,2,3,4,5,6,7,8,9};
string b="5";
if(a[5]==(unsigned char)atoi(b.c_str())){
cout<<true<<endl;
}
我错过了什么?
如果您确定您的字符串 b
恰好有一个字符:
char c = b[0];
就是这样。
atoi
不提取字符,而是将数字内容解析为整数。
或许转换成字符串比较好:
#include <iostream>
#include <string>
int main() {
unsigned char a[10]={0,1,2,3,4,5,6,7,8,9};
std::string b="5";
std::cout<<std::boolalpha<<(std::to_string(a[4])==b)<<std::endl;
std::cout<<std::boolalpha<<(std::to_string(a[5])==b)<<std::endl;
return 0;
}
如果您尝试打印 true
,您的示例代码有一个或多个问题。有多少取决于你如何尝试做到这一点。 如果您将文本与其他文本进行比较,我的前两点适用。如果您尝试将文本转换为数字并比较数字,请忽略它们。
unsigned char a[10]={0,1,2,3,4,5,6,7,8,9}; // 1
string b="5";
if(a[5]==(unsigned char)atoi(b.c_str())){ // 2
count<<true<<endl; // 3
}
1) 虽然这会生成一个无符号字符数组,但它们不是文本值。该数组中的值是前 10 个 ASCII characters,而不是打印时产生“0”到“9”的字符。这些字符可以用代码放在你的数组中:
unsigned char a[10]={'0','1','2','3','4','5','6','7','8','9'};
同样,这仅适用于您尝试比较文本数据的情况。如果您尝试转换为数字并将此数组中的条目与该数字进行比较,您将需要原始数组。
2) a[5]
将访问 a
的第六个元素是正确的。如果要比较文本值而不是数值,则只需访问字符串的第一个元素进行比较。 前提是您知道该字符串的大小至少为 1 个元素。因为您是在这段代码的上方定义它的,所以没问题,但是在用户输入的情况下,您需要检查.这种比较的正确语法,再次如 deviantfan 所述,是 a[5] == b[0]
,因为 strings
上的 []
运算符将 return 一个 char
.
再次重申,以上内容仅在您比较文本值时才适用于您的答案。如果您比较的是数值,那么您的原始代码是正确的。
3) 您没有在 true
两边加上引号。虽然这会编译,甚至打印一些东西——但它不会是 true
,除非满足一些你在编码生涯早期不太可能遇到的条件。您可能想要输入的是 "true",这将使输出打印为真。此外,您想要 cout
,而不是 count
。
这是一个 link 示例,该示例将字符串和(修改后的)字符数组作为文本数据进行比较。如果您正在比较数字数据,那么您的代码唯一的错误是 3)。