C ++:打印/分配简单的数组打印乱码

时间:2010-09-21 11:03:25

标签: c++ arrays

我的代码基本上是列出输入字符串的ASCII代码点,我的下面的代码很简单,在这里:

#include <iostream>
#include <string.h>

using namespace std;

int main() {
    char str[20];
    int result[20];
    cin >> str;

    for(int i = 0; i != strlen(str); i++) {
        result[i] = (int)i; 
    }

    for(int i = 0; i != 20; i++)
        cout << result[i] << ", "; 
}

当我运行它时,无论输入什么输出它都会输出像未定义的内存那样的乱码:

0, 1, 2, 3, 4, 5, 1, -1217349408, -1220040795, -1220041307, -1076427112, 134514781, -1218903292, 134519344, -1076427096, 134514004, -1217411568, 134519344, -1076427048, 134514681,

我是否错过了将每个整数附加到数组的简单方法?

请注意,这是一个简单的例子,我的输入不会超过20个字符。

编辑我的结果中的错误.. cin&gt;&gt;结果是cin&gt;&gt; str

6 个答案:

答案 0 :(得分:2)

此循环将迭代多次等于'str'的长度。也就是说,它将为'str'中的每个字符迭代一次,并在'null终止符'(char值为0)处停止,这就是c字符串的结束方式。在每个循环中,'i'的值是循环编号,从0开始 - 这是您在结果数组中为该索引指定的值。

for(int i = 0; i != strlen(str); i++) {
    result[i] = (int)i; 
}

因此,例如,对于长度为5的字符串,您将分别将值“0,1,2,3,4”分配给这些索引处的结果数组。结果数组中的其他值未分配 - 因此可以保存任何值(通常,在您开始使用它之前,该位内存中的任何值)。如果您的字符串长度超过20个字符,则会遇到麻烦,因为您将开始尝试访问索引20及更高版本的数组,这不是属于您的程序的内存。

此循环打印出'result'数组中的所有值,从索引0处的值到索引19处的值:

for(int i = 0; i != 20; i++)
    cout << result[i] << ", "; 

因此它将打印初始值,如果字符串长度小于20个字符,则也会打印未初始化的值。

至少,要开始获得类似你所追求的结果,你想要改变

result[i] = (int)i; 

result[i] = str[i];

但正如其他人所提到的,为了避免上面提到的一些内存访问问题,如果使用迭代器来获取字符值会更好。

for(string::iterator i = str.begin(); i != str.end(); i++)
  // access char here using '*i'

答案 1 :(得分:1)

strlen(str)会为您提供未定义的输出,因为您尚未初始化str[]的内容。

答案 2 :(得分:1)

你有3个问题:

  1. 您没有使用正确的字符串初始化str,因此strlen将返回不可预测的值。
  2. 您初始化strlen(str)的第一个result位置,但稍后将其打印到索引20.您应该在两个循环上使用相同的条件。
  3. 你绝对应该使用std::string及其迭代器。

答案 3 :(得分:1)

基本上,您未能正确初始化字符串,并且您没有检查它是否是正确的大小。正确的代码:

#include <iostream>
#include <string> // NOT <string.h>, <string>

int main() {
    std::string str;
    std::cin >> str;
    std::cin.ignore();
    for(std::string::iterator it = str.begin(); it != str.end(); it++) {
        std::cout << (int)(*it);
        if (it + 1 != str.end())
            std::cout << ", ";
        else
            std::cout << "\n";
    }
    std::cin.get();
}

答案 4 :(得分:0)

您尚未初始化str,而您正在使用strlen

当你做了

cin >> result; // this does not even compile!!!

我想你的意思是

cin >> str;

目前还不清楚你要做什么。但是你可以尝试这个来获得一些有意义的结果:

char str[20];
int result[20] = {0};
cin >> str;
...// rest all unchanged.

答案 5 :(得分:0)

stlen( str )将在空终结符之前给出的字符数。

这意味着只有strlen(str)个整数才有效。其余的都没有初始化。

另外:看看std::transform。您可以避免临时的整数数组实现相同,或者transform直接进入一个整数。

int to_codepoint( char c ) { return (int) c; }


// ...
char cs[] = "abcd";
std::transform( cs, cs+strlen(cs)
             , std::ostream_iterator<int>( std::cout, ", " ), to_codepoint);

// or transform into an array:
int is[ 1000 ]; // 1000 enough?
std::transform( cs, cs+strlen(cs)
              , is, to_codepoint );

test code at codepad.org