#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;
}
}
问题示例:我输入十五个字母,但只打印四个整数。我输入了七个字母,但只打印了四个整数。
循环仅在我的计算机上出现四次,而不是字符串中的字符数。
这是我遇到的唯一问题,所以如果你看到其他错误,请不要告诉我。 (这样更有趣。)
感谢您的时间。
答案 0 :(得分:11)
sizeof
返回表达式的大小。对于您而言,这是std::string
,对于std::string
的实施,这是四个。 (可能是内部指向缓冲区的指针。)
但是你知道,该缓冲区仅由字符串指向,它对std::string
本身的大小没有影响。你想要message.size()
,它给你那个缓冲区指针所指向的字符串的大小。
当string
的内容发生变化时,缓冲区指针指向哪些变化,但指针本身的大小始终相同。
请考虑以下事项:
struct foo
{
int bar;
};
此时,sizeof(foo)
已知;它是一个编译时常量。它是int
的大小以及编译器可能添加的任何其他padding。
您可以让bar
接受您想要的任何值,并且大小保持不变,因为bar
的值与bar
的类型和大小无关本身。
答案 1 :(得分:5)
您想使用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
会给您相同的结果。
答案 2 :(得分:2)
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...
答案 3 :(得分:1)
sizeof(type)
返回类型的大小,而不是对象。使用length()方法查找字符串的长度。
答案 4 :(得分:-2)
使用命名空间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;
}