2011-12-16 18 views
3

私はここでポインタを名前に1つ設定し、もう1つは名前に再度ポイントするように設定しますが、lenthを取得します。どうすれば私はcout << strlen(tail);を使用して、それは私が第3が3であることを伝え続けますか?たとえ私が12の何かを入力しても?ポインタとcstringの長さ

#include <iostream> 
#include <stdio.h> 
#include <string.h> 
using namespace std; 

int main() 
{ 
    char name[0]; 
    cout << "Please enter your name: "; 
    cin.getline(name, 256); 
    cout << "Your name: " << name << endl; 

    char* head = name; 
    cout << head[6] << endl; 

    char* tail = name; 
    cout << strlen(tail); 

    return 0; 
} 
+0

tip:通常は、C++では 'char *'の代わりに 'string'を使うべきです。明確に書式化された質問の場合は – amit

+1

+1。 –

+1

ええ、バッファオーバーフロー! – nobsid

答えて

6

あなたは、データを格納するサイズ0のバッファを割り当てています。あなたが入力する最長の文字列(NULターミネータに1を加えたもの)が256になるようにする必要があります(255文字とNULをcin.get(name, 256)で読み込んでいるため)。

+0

それはそれを大きく設定するだけで安全ですか? – mystycs

+0

@mystycsいいえ、 'char name [0]'を実行すると、あなたは自分自身に使用するメモリを与えていません。 'cin.getline(name、256)'を行うので、256が必要です。それよりも少なくて済む場合は、バッファサイズに合わせて 'x 'のバッファサイズを変更し、' cin.getline(name、x) 'を変更してください。また、あなたが何をしているのかわからない場合は、Cの文字列を使って作業することは危険です(そして、あなたがしても危険な場合があります)。 **あなたがポインタと配列**に慣れた後は、文字列に 'std :: string'を使い、配列に' std :: vector'を使うことをお勧めします。 –

+0

まあ、私は0に設定すると、誰かが名前を入力するか、そのように動作しないので、単に展開されると思ったのですか? – mystycs

5

名前は長さゼロと宣言されています。それは問題になるだろう。

char name[0]; 

関連する問題