#include <iostream>
using namespace std;
int main()
{
cout << "Do you need to encrypt or decrypt?" << endl;
string message;
getline(cin, message);
int letter2number;
for (int place = 1; place < sizeof(message); place++)
{
letter2number = static_cast<int>(message[place]);
cout << letter2number << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
问题的例子:我输入十五个字母,但只打印四个整数.我输入了七个字母,但只打印了四个整数.
循环仅在我的计算机上出现四次,而不是字符串中的字符数.
这是我遇到的唯一问题,所以如果你看到其他错误,请不要告诉我.(这样更有趣.)
感谢您的时间.
GMa*_*ckG 11
sizeof返回表达式的大小.对你来说,这是一个std::string和你的实施std::string,那是四个.(可能是内部指向缓冲区的指针.)
但是你看,缓冲区只是由字符串指向,它对std::string自身的大小没有影响.你想要message.size()的,它给你的缓冲区指针所指向的字符串的大小.
当string内容发生变化时,缓冲区指针指向哪些变化,但指针本身的大小始终相同.
考虑以下:
struct foo
{
int bar;
};
Run Code Online (Sandbox Code Playgroud)
此时,sizeof(foo)已知; 它是一个编译时常量.它的大小int与编译器可能添加的任何其他填充一起.
您可以bar接受任何您想要的值,并且大小保持不变,因为它bar的价值与其bar自身的类型和大小无关.
你想用message.size()没有sizeof(message).
sizeof只给出数据类型或表达式中的字节数.您想要通过调用给出的字符串中存储的字符数size()
索引也从0开始,注意我从1变为0.
for (int place = 0; place < message.size(); place++)
{
letter2number = static_cast<int>(message[place]);
cout << letter2number << endl;
}
Run Code Online (Sandbox Code Playgroud)
x86系统上的任何指针只有4个字节.即使它指向堆上包含100个元素的数组的第一个元素.
例:
char * p = new char[5000];
assert(sizeof(p) == 4);
Run Code Online (Sandbox Code Playgroud)
假设没有填充,p在a中包装class或struct将给出相同的结果.