2014-01-17 160 views
1

这是一个C++相关的问题。 我需要制作一个读取用户体重/身高的程序。这一切都很好,并且很棒,但是我遇到了一个问题。C++英尺/英寸

用户需要能够输入一个数字,然后输入一个测量单位。这可以以英尺/英寸,米或厘米为单位。我得到了所有的工作,但用户也应该能够写一些东西,如5',并有可选的英寸。 继承人问题即时通讯: 我有两个变量即时通讯使用用户输入,一个双(高度)和一个字符串(unitHeight)。这对于m和cm都很好,但对于英尺/英寸我需要再加两个,因为用户需要输入两个字符串和两个数字(为简单起见,我将它保留为双打) 所以我使用if语句:

if (unitHeight == "'"){ 
    cin >> height2; 
    cin >> unitHeight2; 
} 

现在唯一存在的问题是我需要这样做,以便当用户输入x'(x是任意数字) 该程序不要求任何进一步的输入。 这可能是显而易见的,我可能只需要退后一步,但我一直在考虑这一段时间,并且我个人无法弄清楚它

任何帮助表示赞赏。

+6

你应该得到整条线并解析它。用一个实际的行,你可以检查接下来的两个标记是否是一个数字,并且“ – chris

+1

如果你在'5''后面停下来,怎么会有人进入'5'2''? –

+0

我不认为你可以比较一个“”块。 – BWG

回答

2

做什么取决于可能提出什么其他的输入(如果有的话)的高度后,你希望如何处理错误,但让你开始有点:

int height2 = 0; 
if (unitHeight == "'" && cin >> height2) 
{ 
    if (!(cin >> unitHeight2)) 
    { 
     std::cerr << "hey, " << height2 << " what? give me units baby!\n"; 
     exit(EXIT_FAILURE); 
    } 
    // if we get here, then we have height2 and unitHeight2 to work with... 
    ... 

} 
else if (cin.eof()) 
{ 
    // might have hit EOF without inches, that could be legal - depends on your program 
    ... 
} 
else 
{ 
    // saw some non-numeric input when expecting height2 - is that ok? 
    ... 
} 

既然你贴,你我们添加了一条评论,表示您特别希望在一行中输入此信息,之后用户可以按回车。要处理该问题,请使用std::string line; if (getline(std::cin, line)) { std::istringstream iss(line); >>above code goes here<< } else { ...couldn't read a line of input...}围绕上述代码。

另外,你说:

用户需要能够输入一个数字,然后之后的测量单位。这可以以英尺/英寸,米或厘米为单位。我得到了所有的工作

...我希望如此,但请注意,它是有点棘手, 5'11“and 180cm,as cin >> height1 >> unitHeight1,then unitHeight1 is std::string,will read”'11“。如果您制作unitHeight1 a char,那么它会倾向于从”cm“读取”c“,所以这两种类型都不适用于。这两种写法你最好读一个字符然后用它来决定是否读另一个....

+0

等待。我是一种C++ nooby在这里。比较unitHeight对'''“'去工作?我认为''”'返回指针的数据对于那个字符串(字符)。或者我误解了一些东西? – BWG

+0

我已经拼凑了我所有不同类型的单元的方式是我有一个double(高度)和一个字符串(unitHeight),用户输入说200厘米或1.5米或5.8英尺,所有这些然后在方法中检查并最终转换成米,因为这就是即时通讯工具进行进一步计算。 用户也可以输入5'7“例如 我的方式这个,我上面解释过,如果,一个d如果unitHeight是'那么它允许另一个双精度和另一个字符串输入是英寸和双引号。 我只需要弄清楚如何让用户不需要输入英寸。 –

+0

@BWG:在C++中,'std :: string'变量可以直观地(即用'==','!=','<等等)与字符串文字进行比较(即双引号ASCIIZ类型数组的文本常量这是因为'std :: string'实例化了一个模板类,它有一个“用户定义的”(标准库提供的)'operator ==',它接受一个' const char *'作为右手边的参数,但知道在内部执行'strcmp()'-ish操作。 –

0

你可以做这样的事情:

string height; 
cin >> height; 

for(int i = 0; i < height.size(); i++) { 
    if(height[i] == "'"[0]) { 
     cout << "It's ok!" << endl; 
     break; 
    } 
} 
+0

为什么?据我所知,没有什么我需要它。 –

+0

此代码将识别您何时会拥有“'”。所以,你会知道,在它之后,你会有英寸(忘记那个“休息”)。 –

+0

感谢您的输入,但我不需要for循环。我知道一个事实,即输入将是double,string,double,string(他们只是真正的整数,但我保留它们作为后来需要的计算的双打,并且我不喜欢类型转换)问题I我的意思是,用户需要能够做到5'7“或只是简单的5',然后按回车键,不会要求输入英寸值 –

0

同时读取标准输入一行。处理每一行,如果一行包含第二个数字(对于高度)和第二个字符串(对于单位),那么你有英尺+英寸规格,否则你只有一个数字和一个单位。

const int maxLength = 200; 
while (true) 
{ 
    char line[maxLength+1]; 
    std::cin.getline(line, maxLength); 
    if (!cin.good()) 
    { 
     break; 
    } 

    std::istringstream str(line); 
    double height1; 
    std::string unit1; 
    double height2; 
    std::string unit2; 
    bool secondHeightFound = false; 
    str >> height1 >> unit1 >> height2; 
    if (str.good()) 
    { 
     str >> unit2; 
     secondHeightFound = true; 
    } 
} 
相关问题