无符号字符上的键盘输入?

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

【问题讨论】:

我建议你阅读this std::getline reference。如果你这样做,你会看到没有重载需要一个字符数组(有符号或无符号)。 uchar typedefed 是什么? 【参考方案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 而不是 "c​​har *" ,因此您的程序无法编译。 下面是两个版本的 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之前测试。

以上是关于无符号字符上的键盘输入?的主要内容,如果未能解决你的问题,请参考以下文章

从键盘上输入任意一个字符,求出它的ASCII码并输出

C语言从键盘输入一个含有英文字母,英文符号,数字的字符串,如何过滤其中的字母??

关于键盘

Ubuntu无法输入管道符及其他符号

Ubuntu无法输入管道符及其他符号

Python中如何从键盘中输入字符串,统计字母,数字,符号和空格的个数?