我的目标是将用户输入的字符串转换为Tap Code / Knock Code。 https://en.wikipedia.org/wiki/Tap_code
我遇到的问题是我不知道如何比较从字符串到结构数组的字符。
我想读取一个字符串的字母,然后将其与结构数组进行比较。 因此,如果我输入字母“ a”,则代码会将其与数组进行比较,并输出分配给该字母的相应行和列,在这种情况下为11。
如何比较这两件事?
在这里结构是强制性的。
(编程新手)
#include <iostream>
#include <string>
using namespace std;
struct letter
{
int row;
int column;
};
int main()
{
int x1 = 0;
string input;
letter a; a.row = 1; a.column = 1;
letter b; b.row = 1; b.column = 2;
letter c; c.row = 1; c.column = 3;
letter d; d.row = 1; d.column = 4;
letter e; e.row = 1; e.column = 5;
letter f; f.row = 2; f.column = 1;
letter g; g.row = 2; g.column = 2;
letter h; h.row = 2; h.column = 3;
letter i; i.row = 2; i.column = 4;
letter j; j.row = 2; j.column = 5;
letter k; k.row = 1; k.column = 3;
letter l; l.row = 3; l.column = 1;
letter m; m.row = 3; m.column = 2;
letter n; n.row = 3; n.column = 3;
letter o; o.row = 3; o.column = 4;
letter p; p.row = 3; p.column = 5;
letter q; q.row = 4; q.column = 1;
letter r; r.row = 4; r.column = 2;
letter s; s.row = 4; s.column = 3;
letter t; t.row = 4; t.column = 4;
letter u; u.row = 4; u.column = 5;
letter v; v.row = 5; v.column = 1;
letter w; w.row = 5; w.column = 2;
letter x; x.row = 5; x.column = 3;
letter y; y.row = 5; y.column = 4;
letter z; z.row = 5; z.column = 5;
struct letter arr[26] = {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z };
cout << "Input string using only small letters.\n";
getline(cin, input);
int length = input.size();
for (int x = 0; x < length; x++)
{
do
{
x1++;
}
while (input[x] != arr[x1]); ////////////////////////////This
}
}
1>------ Build started: Project: labwokrk4, Configuration: Debug Win32 ------
1>labwokrk4.cpp
1>C:\Users\lietotajs\Desktop\corse work\labwokrk4\labwokrk4.cpp(62,29): error C2678: binary '!=': no operator found which takes a left-hand operand of type 'char' (or there is no acceptable conversion)
1>C:\Program Files (x86)\visual basic temp\VC\Tools\MSVC\14.23.28105\include\system_error(253,24): message : could be 'bool std::operator !=(const std::error_condition &,const std::error_condition &) noexcept'
1>C:\Program Files (x86)\visual basic temp\VC\Tools\MSVC\14.23.28105\include\system_error(248,24): message : or 'bool std::operator !=(const std::error_condition &,const std::error_code &) noexcept'
1>C:\Program Files (x86)\visual basic temp\VC\Tools\MSVC\14.23.28105\include\system_error(243,24): message : or 'bool std::operator !=(const std::error_code &,const std::error_condition &) noexcept'
1>C:\Program Files (x86)\visual basic temp\VC\Tools\MSVC\14.23.28105\include\system_error(238,24): message : or 'bool std::operator !=(const std::error_code &,const std::error_code &) noexcept'
1>C:\Program Files (x86)\visual basic temp\VC\Tools\MSVC\14.23.28105\include\exception(302,24): message : or 'bool std::operator !=(const std::exception_ptr &,std::nullptr_t) noexcept'
1>C:\Program Files (x86)\visual basic temp\VC\Tools\MSVC\14.23.28105\include\exception(298,24): message : or 'bool std::operator !=(std::nullptr_t,const std::exception_ptr &) noexcept'
1>C:\Program Files (x86)\visual basic temp\VC\Tools\MSVC\14.23.28105\include\exception(294,24): message : or 'bool std::operator !=(const std::exception_ptr &,const std::exception_ptr &) noexcept'
1>C:\Users\lietotajs\Desktop\corse work\labwokrk4\labwokrk4.cpp(62,29): message : while trying to match the argument list '(char, letter)'
1>Done building project "labwokrk4.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
答案 0 :(得分:0)
实际上没有必要遍历数组来查找匹配的字母。您可以使用字符算术将输入中的字母转换为Tap Code数组的索引。
这看起来像:
for (int x = 0; x < length; x++)
{
if(std::isalpha(static_cast<unsigned char>(input[x]))) { // If it's not a letter, don't bother
continue;
}
int indx = std::tolower(static_cast<unsigned char>(input[x])) - 'a'; // Transform into index
letter tap = arr[indx];
// Do Tap Code stuff...
}