我的代码基本上是列出输入字符串的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
答案 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个问题:
str
,因此strlen
将返回不可预测的值。strlen(str)
的第一个result
位置,但稍后将其打印到索引20.您应该在两个循环上使用相同的条件。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 );