额外的数字被追加到字符串,不知道为什么?
Number(string binary)
{
int raw_string_int[size];
char raw_string_char[size];
strcpy(raw_string_char,binary.c_str());
printf("Raw String is %s",raw_string_char);
for (int i=0;i<size;i++)
{
raw_string_int[i] = int(raw_string_char[i]);
printf("%i\n",int(raw_string_char[i]));
if (raw_string_int[i] != 0 || raw_string_int[i] != 1)
{
printf("ERROR NOT A BINARY NUMBER\n");
exit(0);
}
}
嗨,我在命令提示符下输入0001作为二进制文件,但raw_string_char附加了两个额外的数字。任何人都可以向我解释为什么这是?回车是否被作为字符引入?额外的数字被追加到字符串,不知道为什么?
这是我在命令提示符处获得什么:
./test
0001
Raw String is 000148
ERROR NOT A BINARY NUMBER
要打印的每一个字符在raw_string_char
。直到第一个零字符(即'\0'
,而不是0
)C风格的字符串。
更改为for (int i = 0; raw_string_char[i] != 0 && i < size; i++)
。
您在第一个printf中忘记了“\ n”。 48来自第二个printf,并且是将第一个“0”(ASCII 0x30 = 48)转换为int的结果。
要将文本0或1转换为相应的整数,您需要减去0x30。
我在printf语句中包含了一个\ n,似乎已经在某种程度上解决了这个问题。我现在得到原始字符串0001的正确值。但之后48打印出来,我不知道为什么。你可以进一步了解为什么printf语句会改变数组的值? – ChitownDev 2010-09-17 20:22:02
要将文本数字转换为相应的整数,首选减去“0”而不是0x30。 0x30是'0'的ASCII码;但是在切换到其他文本编码方案时,0x30可能不起作用。 “0”更具可读性。 – 2010-09-18 00:19:20
raw_string_char永远不会初始化,额外的字符可能是由于这一点。使用memset来初始化数组。
memset(raw_string_array, 0, size);
这不是必需的。 strcpy添加一个空终止符。 – Porculus 2010-09-17 20:16:45
仍然获得相同的输出... – ChitownDev 2010-09-17 20:18:18
Procolus的答案是正确的,我敢打赌,如果您将\ n添加到第一个printf,您将在换行符中看到48个! – display101 2010-09-17 20:32:39
你的假设char('0') == int(0)
和char('1') == int(1)
只是不成立。在ASCII中,这些字符的值为48和49.
您应该如何获取数字字符的整数值是减去'0'
而不是简单转换(raw_string_int[x] = raw_string_char[x] - '0';
)。
虽然我认为你有概念上的问题。该数组最后不能填满有效值(相应的C字符串至少包含一个空终止符,它不是有效的二进制字符)。您可以使用该字符串的size()
方法来确定该字符串实际包含多少个字符。当然,如果binary
字符串包含size
个字符或更多,那么您冒着缓冲区溢出的风险。
如果目的是检查输入是否是有效的二进制数,为什么你不能测试原始字符串,为什么你会复制数据到另外两个数组?
与其他人一样,'0'被转换为整数48.您并不需要将C++字符串转换为C样式字符串。你可以在C++字符串上使用迭代器或索引操作符[]。您还需要使用逻辑AND & &而不是逻辑OR ||在你的if语句中。
#include<cstdio>
#include<string>
void Number(std::string binary) {
for(std::string::const_iterator i = binary.begin(); i != binary.end(); i++)
if(*i != '0' && *i != '1')
{
printf("ERROR NOT A BINARY NUMBER\n");
return;
}
}
int main() {
Number("0001");
}
没有工作...相同的输出。 – ChitownDev 2010-09-17 20:14:46
这是真的,但不是问题的原因。 – Porculus 2010-09-17 20:15:16