4
#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 文字入力しましたが、4 つの整数しか出力されません。7 文字入力しましたが、4 つの整数しか表示されません。

ループは、文字列内の文字数ではなく、私のコンピューターで 4 回しか発生しません。

これは私が抱えている唯一の問題なので、他のエラーが表示された場合は教えないでください. (その方が楽しいです。)

お時間をいただきありがとうございます。

4

5 に答える 5

11

sizeof式のサイズを返します。あなたの場合、それは でstd::stringあり、 の実装のstd::string場合、それは 4 です。(おそらく、内部的にはバッファーへのポインターです。)

しかし、ご覧のとおり、そのバッファーは文字列によってのみ指されており、std::stringそれ自体のサイズには影響しません。message.size()これにより、そのバッファーポインターが指す文字列のサイズが得られます。

string内容が変わると、そのバッファ ポインタが指すものも変わりますが、ポインタ自体は常に同じサイズです。


次の点を考慮してください。

struct foo
{
    int bar;
};

この時点で、sizeof(foo)既知です。これはコンパイル時の定数です。これは、コンパイラが追加する可能性のある追加のパディングintを含むのサイズです。

の値はそれ自体の型やサイズとは何の関係もないbarため、必要な任意の値を取ることができ、サイズは同じままです。barbar

于 2010-04-03T05:24:54.697 に答える
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);

orでラップpすると、パディングがない場合と同じ結果が得られます。classstruct

于 2010-04-03T05:24:40.640 に答える
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...
于 2010-04-03T05:48:36.373 に答える
1

sizeof(type)オブジェクトではなく、型のサイズを返します。length() メソッドを使用して、文字列の長さを確認します。

于 2010-04-03T05:25:53.307 に答える
-2
#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;
}    
于 2010-04-03T16:59:05.510 に答える