尝试在cstring中给出一个空格时崩溃

时间:2013-06-25 17:35:04

标签: c++

我写了一个控制台程序,如果我在fp->类中给出一个空格,那么它会崩溃。这是我的代码。

#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).

3 个答案:

答案 0 :(得分:3)

cin使用空格分隔输入标记。 例如:

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

在您的代码中,如果您为第一个cin>>提示输入空格,例如“A B”。

fp-&gt;种类设置为“A”
fp-&gt; weight设置为“B”,cin读入next并尝试转换为float但失败。

您需要使用getline来读取整行。

答案 1 :(得分:1)

#include <string>

//...

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

是没有原始数组导致的漏洞的正确实现。

顺便说一下,你的崩溃不是因输入空格而是因为缓冲区溢出造成的。

答案 2 :(得分:0)

这应该可以解决问题。它不会导致任何漏洞,如上面提到的那些Jule,并且会在“kind”字段中占用任意数量的空格或超级特殊字符。请注意,这使用默认的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;
}