0

コンソール プログラムを作成しましたが、fp->kind にスペースを入れるとクラッシュします。これが私のコードです。

#include <iostream>

struct fish
{
char kind[40];
float lenght;
float weight;
};

int main()
{
using std::cout;
using std::cin;

fish* fp = new fish();

cout<<"enter the kind of fish: ";
cin>>fp->kind;
cout<<"\nenter the weight of the fish: ";
cin>>fp->weight;
cout<<"\nenter the lenght of the fish: ";
cin>>fp->lenght;
cout<<"\nKind: "<<fp->kind
    <<"\nlenght: "<<fp->lenght
<<"\nweight: "<<(*fp).weight;
cin.get();
cin.get();
delete fp;
return 0;
}

スペースを空けなくてもクラッシュしません。

PS imはVisual Studio 2012を使用しています。ここにデバッグ出力があります。

'Project1.exe' (Win32): Loaded 'C:\Users\Dark Vadar\Documents\Visual Studio      2012\Projects\Project1\Debug\Project1.exe'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. Cannot find or open the   PDB file.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. Cannot find or open  the PDB file.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. Cannot find or open the PDB file.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\msvcp110d.dll'. Symbols loaded.
'Project1.exe' (Win32): Loaded 'C:\Windows\System32\msvcr110d.dll'. Symbols loaded.
 The program '[1848] Project1.exe' has exited with code 0 (0x0).
4

3 に答える 3

3

cin入力トークンを区切るために空白を使用します。例:

//Input: apples oranges
cin >> str1;
cin >> str2;
//You get str1 = "apples", str2 = "oranges"

コードで、cin>>「A B」のように最初のプロンプトにスペースを入力した場合。

fp->kind は "A" に設定されてい
ます fp->weight は "B" に設定されており、cin は次にそれを読み込み、float に変換しようとしますが失敗します。

代わりにgetlineを使用して行全体を読み取る必要があります。

于 2013-06-25T17:42:45.070 に答える
1
#include <string>

//...

struct fish
{
    std::string kind;
    float lenght;
    float weight;
};

raw アレイによる脆弱性のない正しい実装です。

ところで、あなたのクラッシュは空白の入力ではなく、バッファ オーバーフローが原因です。

于 2013-06-25T17:41:22.983 に答える