额外的数字被追加到字符串,不知道为什么?

时间:2010-09-17 20:05:56

标签: c++ string

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附加了两个额外的数字。任何人都可以向我解释为什么会这样吗?回车是否以char形式出现?

以下是我在命令提示符处获得的内容:

./test
0001
Raw String is 000148
ERROR NOT A BINARY NUMBER

5 个答案:

答案 0 :(得分:9)

你忘记了第一张printf中的“\ n”。 48来自第二个printf,它是将第一个'0'(ASCII 0x30 = 48)转换为int的结果。

要将文本0或1转换为相应的整数,需要减去0x30。

答案 1 :(得分:2)

您认为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个字符或更多字符,您自然会冒缓冲区溢出的风险。

如果打算检查输入是否是有效的二进制数,为什么不能测试原始字符串,为什么要将数据复制到另外两个数组呢?

答案 2 :(得分:1)

您正在raw_string_char打印每个角色。 C风格的字符串一直持续到第一个零字符(即'\0',而不是0)。

更改为for (int i = 0; raw_string_char[i] != 0 && i < size; i++)

答案 3 :(得分:0)

像其他人说的那样,'0'被转换为整数48.你真的不需要将C ++字符串转换为C风格的字符串。您可以在C ++字符串上使用迭代器或索引运算符[]。您还需要使用逻辑AND&amp;&amp;而不是逻辑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");
}

答案 4 :(得分:-2)

raw_string_char永远不会被初始化,额外的字符可能是由此引起的。使用memset初始化数组。

memset(raw_string_array, 0, size);