2010-09-21 83 views
0

我的代码基本上是列出一个字符串,它是输入的ASCII码点,我下面的代码很简单,在这里:C++:打印/分配简单阵列打印乱码

#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 >>结果CIN >>海峡

+2

固定大小的char数组?我眼睛疼!在C++中使用'std :: string'。 – fredoverflow 2010-09-21 11:22:23

+0

不要在循环退出条件中使用strlen - 对每个循环都进行此调用效率不高。首先将strlen存储为本地,因为字符串在循环内不变。 – 2010-09-21 13:51:59

回答

2

该循环将迭代多次,等于'str'的长度。也就是说,它将为'str'中的每个字符迭代一次,并停止在'null terminator'(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及以上的数组,这不属于程序的内存。

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

因此,将打印初始化值,并且,如果:在索引19

这个循环打印出所有的值的“结果”阵列中,从索引0处的值的值字符串长度小于20个字符,也是未初始化的值。

在最低限度,开始得到类似的东西你后的结果,你想改变

result[i] = (int)i; 

result[i] = str[i]; 

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

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

谢谢,这么晚了,在我的OP中一直犯错误。那是一个愚蠢的错误。谢谢。 – John 2010-09-21 11:19:37

0

你没有初始化str和你正在服用的strlen

当你做

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

我想你的意思是

cin >> str; 

它不清楚你想做什么。不过你可以试试这个得到一些有意义的结果:

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

随着我的编辑..我如何初始化? 'char str [20] = {“”}; int result [20] = {0};',我不确定如何初始化数组。我的结果是20个左右的零个数字,也许这是我分配给数组的错误.. – John 2010-09-21 11:08:27

1

strlen(str)会给你一个未定义的输出,因为你没有初始化的str[]内容。

0

stlen(str)将给出空终止符之前的字符数

这意味着只有strlen(str)整数是有效的。其余未初始化。

另请参阅:看看std::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

1

你有3个问题:

  1. 你没有用正确的字符串初始化str,从而strlen将返回一个不可预测的值。
  2. 您初始化了result的第一个strlen(str)位置,但后来您将其打印到索引20之前。您应该在两个循环中使用相同的条件。
  3. 你一定要使用std::string及其迭代器。
+0

而你,你不能算。但2似乎是答案:) – xtofl 2010-09-21 11:21:12

+0

@xtofl:哎呀,确实忘了更新计数。谢谢! – jweyrich 2010-09-21 11:23:09

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(); 
}