在C ++中从控制台可选的用户输入变量?

时间:2018-02-09 09:33:46

标签: c++ input stream optional

我有一个程序,我希望从控制台cin>>一行变换3个变量 - 一个字符串,一个整数和一个char。但是,第三个变量(char)应该是可选的 - 用户可以输入字符串s和整数n,而无需输入char。如果未输入变量symb,则应使用symb=' ';(空格)初始化变量sstream。我听说这可以通过使用#include <iostream> //#include <sstream> #include <string> using namespace std; string s; int n; char symb; int main() { cin>>s>>n>>symb (optional); if(symb is not entered) { symb = ' '; (whitespace) } return 0; } 来实现,但如果可能的话,我怎么能弄明白我怎么能这样做呢?

<script type="text/javascript">
function update()
{
 var scatola=document.form2.scatola.value;
 var faldone=document.getElementById("faldone").innerText;
 var fascicolo=document.form2.fascicolo.value;
 var desc=document.form2.descrizione.value;
 var tipo=document.form2.tipodocumento.value;
 var annic=document.form2.annicon.value;
 var dal=document.form2.dal.value;
 var al="document.form2.al.value;
 var esd="document.form2.estremidal.value; 
 var esa="document.form2.estremial.value;
 var vec="document.form2.vecchiasegn.value;
 document.form2.action="aggiorna.php?scatola="+scatola+"&faldone="+faldone+"&fascicolo="+fascicolo+"&descrizione="+desc+"&tipod="+tipo+"&annicon="+annic+"&dal="+dal+"&al="+al+"&estremidal="+esd+"&estremial="+esa+"&vecchiasegn="+vec;
 document.form2.submit();
}
</script>
<body>
<?php 
 $conn=mysqli_connect("localhost","root","","barcode");
 $barcode=$_GET["codice"];
 $s="SELECT * from faldoni where faldone like '%$barcode%'";
 $q=mysqli_Query($conn,$s);?>
<form name="form2" action="" onSubmit="update()">
<table>
<?php
$r=mysqli_fetch_array($q);
echo"<tr><td><input type='text' name='scatola' value='$r[0]'></td>
<td id='faldone'>$r[1]></td>
<td><input type='text' name='fascicolo' value='$r[2]'></td>
<td><input type='text' name='descrizione' value='$r[3]'></td>
<td><input type='text' name='tipodocumento' value='$r[4]'></td>
<td><input type='text' name='annicon' value='$r[5]'></td>
<td><input type='text' name='dal' value='$r[6]'></td>
<td><input type='text' name='al' value='$r[7]'></td>
<td><input type='text' name='estremidal' value='$r[8]'></td>
<td><input type='text' name='estremial' value='$r[9]'></td>
<td><input type='text' name='vecchiasegn' value='$r[10]'></td></tr>
</table>";
<input type="reset" value="reset"><input type="submit" value="conferma">
 </form>

2 个答案:

答案 0 :(得分:0)

当然你可以getline然后解析它,但我认为这个解决方案简单易懂。

int main() {
    cin >> s >> n;
    symb = cin.get();
    if (symb == ' ') symb = cin.get(); // then we try to read our symbol
    if (symb == '\n' || symb == EOF) symb = ' ';
    cout << s << "|" << n << "|" << symb << "|\n";
    return 0;
}

但是EOF可以是== -1,并且在c ++ char中不需要签名所以我建议使用peek检查是否eof:

 if (cin.peek() == char_traits<char>::eof()) {/* EOF */}
 else {/* here you know the next char you get won't be EOF */}

或者简单地使用int tmp_symb:

int main() {
    cin >> s >> n;
    int tmp_symb;
    tmp_symb = cin.get();
    if (tmp_symb == ' ') tmp_symb = cin.get(); // then we try to read our symbol
    if (tmp_symb == '\n' || tmp_symb == EOF) tmp_symb = ' ';
    symb = tmp_symb;
    cout << s << "|" << n << "|" << symb << "|\n";
    return 0;
}

答案 1 :(得分:0)

是的,你可以,但它不会很漂亮,也不可能在一行中完成。这个想法是:当你按 Enter 时,你可以在你要求的输入缓冲区中有更多。您可以访问该附加输入。只需要询问非可选数据,然后使用peek()检查缓冲区中是否有更多数据。它将返回下一个字符为整数或等待。在您的情况下,按 Enter 至少会出现换行符。否则会有一个空格将下一个标记与整数n分开。

console.log(RegExp("^[a-zA-Z]+[a-zA-Z0-9?$@#()'!,+\\-=_:.&€£*%\\s]+$"));
// "…" rather than /^[a-zA-Z]+[a-zA-Z0-9?$@#()'!,+\\-=_:.&€£*%\\s]+$/

当你想要在int n之后只处理尾随空格的情况时,它开始变得丑陋。然后peek将不返回换行符,而是返回空格或制表符,std::string s; int n; char symb; std::cin >> s >> n; if (std::cin.peek() == '\n') // pressed enter after string? { sym = ' '; } else { std::cin >> symb; // will not block if we have char in buffer } 将阻止等待角色。我们可以插入cin >> symb以使std::noskipws返回。但是,我们真正想要的是跳过空格和标签:

cin >> symb

这仍然不是很强大。更好地阅读整行并解析它,正如其他答案所建议的那样。