#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;
}
}
问题示例:我键入了15个字母,但只打印了四个整数。我键入七个字母,但只打印四个整数。
循环只会在我的计算机上发生四次,而不是字符串中的字符数。
这是我唯一遇到的问题,因此,如果您看到其他错误,请不要告诉我。 (这样更有趣。)
谢谢您的时间。
sizeof
返回表达式的大小。对您来说,这是std::string
,对您来说,对std::string
的实现是四。 (内部可能是指向缓冲区的指针。)
但是您会看到,该缓冲区仅由字符串指向,它对std::string
本身的大小没有影响。为此,您需要message.size()
,它为您提供了该缓冲区指针所指向的字符串的大小。
[string
的内容更改时,缓冲区指针指向的内容更改,但是指针本身始终是相同大小。
请考虑以下内容:
struct foo
{
int bar;
};
此时,sizeof(foo)
是已知的;这是一个编译时常量。它是int
的大小以及编译器可能添加的所有其他padding。
您可以让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;
}
x86系统上的任何指针只有4个字节。即使它指向包含100个元素的堆上数组的第一个元素。
示例:
char * p = new char[5000];
assert(sizeof(p) == 4);
p
或class
中的struct
包裹将为您提供相同的结果,假定没有填充。
class string
{
char * ptr;
//...
size_t size(); // return number of chars (until null) in buffer pointed to by ptr
};
sizeof(message) == sizeof(string) == sizeof(ptr) == 4; // size of the struct
message.size() == number of characters in the message...
sizeof(type)
返回类型的大小,而不是对象的大小。使用length()方法查找字符串的长度。
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
cout << "Do you need to encrypt or decrypt?" << endl;
string message;
getline(cin, message);
int letter2number;
for (int place = 0; place < message.size(); place++)
{
letter2number = static_cast<int>(message[place]);
cout << letter2number << endl;
}
getch();
return 0;
}