-11

文の文字数を数える次の関数があります

// A function to get a length of any sentence.
int length(char *str){
    int size = 0;
    while(str[size] != '\0'){
    size++;
    }
  return size;
}


int main(){
    char *name = new char;
    int cnt = 0;
    cin.getline(name, length(name));

    cout << length(name) << endl;

  return 0;
}

しかし、文を入力してその長さを取得すると、文の長さがわずか2文字であることがわかりました。

なぜそれが起こるのですか?

4

3 に答える 3

4

これ:

char *name = new char;

1文字分のスペースを割り当てます。

あなたはむしろ次のようなものが欲しい

char buf[0x100];
cin.getline(buf, sizeof(buf));

代わりは。(動的メモリ割り当ては実際には必要なく、ロジックに欠陥があります。事前に入力の長さがわからlength(name)ないため、 の引数として意味がありませんcin::getline()。)

ああ、そしていつもの警告: なぜだろstd::stringう?

std::string str;
std::getline(std::cin, str);
于 2013-07-19T04:47:36.400 に答える
4

問題はこれにあります:

char *name = new char;

1 だけを割り当てていますがchar、1 文字よりも大きなものを格納したい場合は、それだけでは十分ではありません (null ターミネータ用に別の文字が必要であることは言うまでもありません)。

代わりに、次のようにしてみてください。

char* name = new char[64];  // Be careful. Storing more than 64 characters will lead you to more or less the same error
cin.getline(name, 64);
...
delete[] name;  // Be sure to delete[] name

より良い:

char name[64]; // Again, be careful to not store more than 64 characters
cin.getline(name, 64);
...

一番:

std::string name;  // The sane way to use strings
std::getline(std::cin, name);


更新: を使用して文字列の長さを取得する場合は、std::string使用できますstd::string::size()

std::cout << name.size() << std::endl;
于 2013-07-19T04:51:19.660 に答える
0

length「ランダムな」メモリ位置を呼び出して読み取りを開始すると、メインの3行目から始まる「未定義の動作の領域」にいます。これはおそらくあなたが意図したものです

#include <iostream>

using namespace std;

int main(){
    char name[100];
    cin.getline(name, sizeof name );

    cout << sizeof name << ": " << name << endl;

  return 0;
}
于 2013-07-19T04:52:46.523 に答える