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即时使用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;
};

是没有原始数组引起的漏洞的正确实现。

顺便说一句,您的崩溃不是由输入空格引起的,而是由缓冲区溢出引起的。

于 2013-06-25T17:41:22.983 回答
0

这应该可以解决问题。它不会像上面提到的那些 Jule 那样导致任何漏洞,并且会在“种类”字段中占用任意数量的空格或超级特殊字符。请注意,这使用默认的 c 流。我使用这些是因为它们可以被严格控制。注意 scanf 中 '%' 后面的 "39"。这可以防止它读取超过 39 个字符,从而为空终止符多留一个位置。

#include <cstdio>
using namespace std;

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

int main()
{
    fish* fp = new fish();

    printf("enter the kind of fish: ");
    scanf("%39[^\n]", fp->kind);
    printf("enter the weight of the fish: ");
    scanf("%f", &(fp->weight));
    printf("enter the length of the fish: ");
    scanf("%f", &(fp->length));
    printf("\nKind: %s\nlength: %f\nweight: %f\n", fp->kind, fp->length, fp->weight);
    delete fp;
    return 0;
}
于 2013-06-25T18:27:59.793 回答