程序1:程序1从控制台获取一行输入,并将输入字符串分成由空格分隔的子字符串,然后转换为整数值。
#include <cstring>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
char *input;
cin.getline(input,100);
char *token = strtok(input, " ");
while (token != NULL)
{
cout << token << '\n';
token = strtok(NULL, " ");
}
return 0;
}
计划2:
#include <cstring>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
char *input;
cin.getline(input,100);
int a[7];
char *token = strtok(input, " ");
while (token != NULL)
{
cout << token << '\n';
token = strtok(NULL, " ");
}
return 0;
}
程序1工作正常但程序不起作用。两个程序之间的唯一区别是,一个额外的数组a [7]变量。该变量如何导致程序2崩溃。
答案 0 :(得分:2)
因为未定义的行为。
您永远不会为input
分配内存,因此将其与getline
一起使用是未定义的行为。
看起来你只想阅读一些文字并将其打印出来,分成空格。您可以在std::string
上使用operator>>
和std::cin
来获取此信息。
答案 1 :(得分:1)
正如其他人所说,你得到一个未定义的行为,因为你没有为input
分配内存。
您可以通过声明char
数组或以更“C ++方式”执行操作来解决问题。这是一个例子:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main()
{
std::vector<int> a;
cout << "Enter a sequence of numbers: ";
std::copy(std::istream_iterator<int>(cin),
std::istream_iterator<int>(),
std::back_inserter(a));
cout << "You've entered: ";
for (auto& num : a)
{
cout << num << " ";
}
cout << endl;
return 0;
}
如果您仍希望将输入限制为100
(i.e. 'd'
),则可以getline()
从cin
到您用于初始化的std::string
例如std::istringstream iss
。然后std::copy()
代码相同,只需将cin
替换为iss
。
// #include <sstream>
std::string input;
cin.getline(input, 100);
std::istringstream iss(input);
答案 2 :(得分:0)
您尚未为input
分配任何内存以指向,并且使用未初始化的指针调用getline
是未定义的行为。
这意味着任何事情都可能发生,包括您的计划按预期工作,或者没有按预期工作。添加int a[7]
只是改变了程序的内存布局,从而改变了未定义行为的行为。
要解决此问题,您只需将input
设为所需长度的静态数组:
char input[100];