无符号字符上的键盘输入?
Posted
技术标签:
【中文标题】无符号字符上的键盘输入?【英文标题】:Keyboard input on unsigned char? 【发布时间】:2015-12-22 12:31:35 【问题描述】:uchar szPlaintext[128]; //dato da criptare
cout << "\nInserisci testo : ";
getline(cin, szPlaintext);
我用 getline (cin, szPlaintext) 试过了;但我有很多错误。我用VS2015编译。 假设我正在尝试对我的程序实施 AES(不是我的); uchar 声明是这样的。
uchar szPlaintext [128] = "text that I want to insert";
错误是:
1>d:\download\scuola\c++\virtualaes\virtualaes\encrypt.cpp(32): error C2672: 'getline': no matching overloaded function found
1>d:\download\scuola\c++\virtualaes\virtualaes\encrypt.cpp(32): error C2784: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)': could not deduce template argument for 'std::basic_string<_Elem,_Traits,_Alloc> &' from 'uchar [128]'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(157): note: see declaration of 'std::getline'
1>d:\download\scuola\c++\virtualaes\virtualaes\encrypt.cpp(32): error C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)': expects 3 arguments - 2 provided
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(146): note: see declaration of 'std::getline'
1>d:\download\scuola\c++\virtualaes\virtualaes\encrypt.cpp(32): error C2784: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &)': could not deduce template argument for 'std::basic_string<_Elem,_Traits,_Alloc> &' from 'uchar [128]'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(126): note: see declaration of 'std::getline'
1>d:\download\scuola\c++\virtualaes\virtualaes\encrypt.cpp(32): error C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)': expects 3 arguments - 2 provided
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(73): note: see declaration of 'std::getline'
Pietrob0b
Utente Junior
Messaggi: 36
Iscritto il: 10 dic 2015, 20:44
【问题讨论】:
我建议你阅读thisstd::getline
reference。如果你这样做,你会看到没有重载需要一个字符数组(有符号或无符号)。
uchar
typedef
ed 是什么?
【参考方案1】:
std::getline
采用 std::string
引用,而不是原始指针。
string sPlaintext;
cout << "\nInserisci testo : ";
getline(cin, sPlaintext);
uchar* szPlaintext = (uchar*) sPlaintext.c_str(); //dato da criptare
【讨论】:
如果我尝试声明字符串或char,它会与其他函数冲突,原始程序设计为仅使用uchar。为此我问。我正在尝试在我的程序中实现 AES(不是我的)。 那么你应该得到一个字符串并将其解析为 uchar 数组。 @jpo : 否定这一行 "uchar* szPlaintext = (uchar*) sPlaintext.c_str();" .你认为这会出于某种原因吗? @SACHIN uchar 必须是 unsigned char 的 typedef。即使在 OP 中没有明确说明,我怀疑它可能是其他任何东西。 @jpo:uchar 或 char 没问题。我会建议你运行你的程序。它会像那样工作吗?【参考方案2】:正如其他人已经指出的那样, std::getline 引用了 std::string 而不是 "char *" ,因此您的程序无法编译。 下面是两个版本的 std::getline 。
istream& getline (istream& is, string& str, char delim);
istream& getline (istream& is, string& str);
现在,假设你想在 char* 中输入字符串,如何让它工作。按照下面的程序。
// Example program
#include <iostream>
#include <string>
#include<cstring>
int main()
char szPlaintext[128]; //dato da criptare
std::cout << "\nInserisci testo : ";
std::string str ;
getline(std::cin, str);
strcpy(szPlaintext,str.c_str());
std::cout << szPlaintext;
【讨论】:
您的代码不安全,如果用户输入的字符串大于 128,则会出现段错误。 查看 OP 的问题。他自己取了一个大小为 128 的字符串。他面临的唯一问题是将输入插入到这个字符串中,所以我猜他假设输入不会大于 128长度。无论如何,程序的想法是显示,它是如何完成的。如果OP需要更改字符串长度,他可以轻松做到。 大小应该在做strcpy之前测试。以上是关于无符号字符上的键盘输入?的主要内容,如果未能解决你的问题,请参考以下文章