sizeof продолжает возвращать 4 вместо фактического размера - PullRequest
4 голосов
/ 03 апреля 2010
#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;
    }
}

Примеры проблем: я набираю пятнадцать букв, но печатаются только четыре целых числа. Я набираю семь букв, но печатаются только четыре целых числа.

На моем компьютере цикл повторяется только четыре раза, а не количество символов в строке.

Это единственная проблема, с которой я столкнулся, поэтому, если вы видите другие ошибки, пожалуйста, не говорите мне. (Так веселее.)

Спасибо за ваше время.

Ответы [ 5 ]

11 голосов
/ 03 апреля 2010

sizeof возвращает размер выражения. Для вас это std::string, а для вашей реализации std::string - четыре. (Возможно, указатель на буфер, внутри.)

Но вы видите, что буфер указывается только строкой, он не влияет на размер самого std::string. Для этого вы хотите message.size(), который даст вам размер строки, на которую указывает указатель буфера.

При изменении содержимого string изменяется указатель буфера, но сам указатель всегда имеет одинаковый размер.


Примите во внимание следующее:

struct foo
{
    int bar;
};

На данный момент, sizeof(foo) известен; это константа времени компиляции. Это размер int вместе с дополнительными отступами , которые может добавить компилятор.

Вы можете позволить bar принимать любое желаемое значение, и размер остается неизменным, поскольку значение bar не имеет ничего общего с типом и размером самого bar.

5 голосов
/ 03 апреля 2010

Вы хотите использовать 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 голосов
/ 03 апреля 2010
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...
1 голос
/ 03 апреля 2010

sizeof(type) возвращает размер типа, а не объекта. Используйте метод length (), чтобы найти длину строки.

0 голосов
/ 03 апреля 2010

1001 * включают * включают

с использованием пространства имен 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;

}

...