对字符串使用 cin 和 getline
Use of cin and getline for strings
我最近在C++
做一道题:
Write a program to work out if a series of 5 digits are consecutive
numbers. To make this easier, assumes the digits are a string:
string numbers = "10-9-8-7-6";
Make sure your code works for the following sequence, as well:
string numbers = "1-2-3-4-5";
我解决了它,但是我看到当我使用 cin
作为字符串时,控制台 window 抛出了一些异常并且没有执行程序但是用 getline
替换它,效果很好。
任何人都可以向我解释其背后的原因,因为从逻辑上讲两者都应该正常工作。
节目是:
#include<iostream>
#include<string>
using namespace std;
void change(int x, int y, int &inc, int &dec)
{
if (x - y == 1)
++dec;
else if (y - x == 1)
++inc;
}
int main()
{
string s = "", snum = "";
cout << "enter 5 nos and use \'-\' to separate them: ";
cin >> s;
int i = 0, x = 0, y = 0, inc = 0, dec = 0;
for (char &ch : s)
{
if (ch == '-')
{
++i;
if (i == 1)
{
y = stoi(snum);
cout << y << endl;
}
else
{
x = y;
y = stoi(snum);
cout << x << " " << y << endl;
change(x, y, inc, dec);
}
snum = "";
}
else
snum += ch;
}
x = y;
y = stoi(snum);
cout << x << " " << y << endl;
change(x, y, inc, dec);
if (inc == 4 || dec == 4)
cout << "ORDERED";
else
cout << "UNORDERED";
return 0;
}
如果您必须同时输入所有内容,例如:
10 9 8 7 6
全部在一条线上然后 cin
不会同时记录所有内容。
关于 cin
它仅以 space (" ") 之前的字符为例。 Getline
但是会占用整行并使用它。做同样事情的另一种方法是使用 cstdio library
并使用 printf
或 puts
进行提示设置,然后使用 gets
收集所有来自 puts 提示的信息。这就是我认为它起作用的原因。
示例:
cstdio 库
char string[50];
printf("Enter a string of text");
gets(string);
cout << string << endl;
*编辑
在下面的评论之后我意识到你在问什么,如果你假设数字是字符串,并且它们用连字符分隔并且没有 spaces 那么它应该可以正常工作。应该不是cin的问题吧?
如果您的代码中涉及 space,那么我在上面写的编辑将是解决该问题的简单方法。
如果你需要得到格式化的字符串,我推荐你scanf
这样:
if( 5 == scanf("%d-%d-%d-%d-%d", &a, &b, &c, &d, &e) )
//welldone
// work with above 5 int easily :)
else
// Please enter again
这样您就完全不必使用字符串,生活会更轻松。
您可以轻松检查这5个是否连续。
如果您不需要新的解决方案并希望修复您的代码,请在评论中告诉我。
我最近在C++
做一道题:
Write a program to work out if a series of 5 digits are consecutive numbers. To make this easier, assumes the digits are a string:
string numbers = "10-9-8-7-6";
Make sure your code works for the following sequence, as well:
string numbers = "1-2-3-4-5";
我解决了它,但是我看到当我使用 cin
作为字符串时,控制台 window 抛出了一些异常并且没有执行程序但是用 getline
替换它,效果很好。
任何人都可以向我解释其背后的原因,因为从逻辑上讲两者都应该正常工作。
节目是:
#include<iostream>
#include<string>
using namespace std;
void change(int x, int y, int &inc, int &dec)
{
if (x - y == 1)
++dec;
else if (y - x == 1)
++inc;
}
int main()
{
string s = "", snum = "";
cout << "enter 5 nos and use \'-\' to separate them: ";
cin >> s;
int i = 0, x = 0, y = 0, inc = 0, dec = 0;
for (char &ch : s)
{
if (ch == '-')
{
++i;
if (i == 1)
{
y = stoi(snum);
cout << y << endl;
}
else
{
x = y;
y = stoi(snum);
cout << x << " " << y << endl;
change(x, y, inc, dec);
}
snum = "";
}
else
snum += ch;
}
x = y;
y = stoi(snum);
cout << x << " " << y << endl;
change(x, y, inc, dec);
if (inc == 4 || dec == 4)
cout << "ORDERED";
else
cout << "UNORDERED";
return 0;
}
如果您必须同时输入所有内容,例如:
10 9 8 7 6
全部在一条线上然后 cin
不会同时记录所有内容。
关于 cin
它仅以 space (" ") 之前的字符为例。 Getline
但是会占用整行并使用它。做同样事情的另一种方法是使用 cstdio library
并使用 printf
或 puts
进行提示设置,然后使用 gets
收集所有来自 puts 提示的信息。这就是我认为它起作用的原因。
示例:
cstdio 库
char string[50];
printf("Enter a string of text");
gets(string);
cout << string << endl;
*编辑
在下面的评论之后我意识到你在问什么,如果你假设数字是字符串,并且它们用连字符分隔并且没有 spaces 那么它应该可以正常工作。应该不是cin的问题吧?
如果您的代码中涉及 space,那么我在上面写的编辑将是解决该问题的简单方法。
如果你需要得到格式化的字符串,我推荐你scanf
这样:
if( 5 == scanf("%d-%d-%d-%d-%d", &a, &b, &c, &d, &e) )
//welldone
// work with above 5 int easily :)
else
// Please enter again
这样您就完全不必使用字符串,生活会更轻松。 您可以轻松检查这5个是否连续。
如果您不需要新的解决方案并希望修复您的代码,请在评论中告诉我。