我写了一个控制台程序,如果我在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).
答案 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;
}