我有一个程序,我希望从控制台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>
答案 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
这仍然不是很强大。更好地阅读整行并解析它,正如其他答案所建议的那样。