简体   繁体   中英

Passing char variables to a type string function

I have the user enter a keyword which is broken up and put into a five by five array, then another function called "getletter" which fills up the rest of the spaces in the array in alphabetical order excluding those letters already included in the keyword. When I try to pass the values of the keyword to the getletter function it doesn't work.

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<string>
#include<limits>

using namespace std;
string getletter();  
char type[81];
char filename[20];
char key [5];

char f[2] = "q";
    char g[2] = "q";
    char h[2] = "q";
    char i[2] = "q";
    char j[2] = "q";
    char k[2] = "q";
    char l[2] = "q";

int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;

int main(){



string cipherarray[5][5]= {
{"a","f","k","p","v"},
{"b","g","l","r","w"},
{"c","h","m","s","x"},
{"d","i","n","t","y"},
{"e","j","o","u","z"}

};





cout<<"Enter the name of a file you want to create.\n";

cin>>filename;

cout<<"enter your codeword(codeword can have no repeating letters)\n"; 

cin>>key;

while (key[a] != '\0' ){

while(b <= 4){
cipherarray[b][c] = key[a];

 if (  f == "q" ) {
 cipherarray[b][c] = f;
}

 if ( f != "q" && g == "q"  )
 {
cipherarray[b][c] = g;
}

 if ( g != "q" && h == "q" )
 {
cipherarray[b][c] = h;
}

 if ( h != "q" && i == "q"  )
 {
cipherarray[b][c] = i;
}


 if ( i != "q" && j == "q" ) 
{
cipherarray[b][c] = j;
}

 if ( j != "q" && k == "q" )
 {
cipherarray[b][c] = k;
}

 if ( k != "q" && l == "q" )
 {
cipherarray[b][c] = l;
}
a++;
b++;
if (key[a] == 0)
break; 
}

if (key[a] != 0){
c++;
b = 0;
}
}

while ( c <= 4) {
while ( b <= 4) {
 cipherarray[b][c] = getletter();
 b++;     
}
b = 0;
c++;
} 










b = 0;
c = 0;

while ( c <= 4) {
while ( b <= 4) {
 cout<<cipherarray[b][c]<<" ";
 b++;     
}
cout<<endl;
b = 0;
c++;
} 






 cout<<"now enter some text."<<endl<<"To end this program press Crtl-Z\n";


ofstream outFile;
outFile.open(filename);
outFile<<fixed;
outFile.precision(2);
outFile.setf(ios_base::showpoint);
cin.ignore(std::numeric_limits<int>::max(),'\n');

while(!cin.fail()){

 cin.getline(type,81);

outFile<<type<<endl;
}

outFile.close();
}





string getletter() {
string letter;
string cipherarraytemplate[5][5]= {
{"a","f","k","p","v"},
{"b","g","l","r","w"},
{"c","h","m","s","x"},
{"d","i","n","t","y"},
{"e","j","o","u","z"}
};


if (cipherarraytemplate[d][e] == f || cipherarraytemplate[d][e] == g || cipherarraytemplate[d][e] == h || cipherarraytemplate[d][e] == i || cipherarraytemplate[d][e] == j ||
 cipherarraytemplate[d][e] == k || cipherarraytemplate[d][e] == l){ 
 d++; 
 } 
 else {
letter = cipherarraytemplate[d][e];
}
d++;
if (d == 5){
e++;
d = 0;
}
return letter;
}

I think the problem is in the comparisons

if ( j != "q" && k == "q" )

etc. The problem is that these variables are statically-typed as char [2] , and so equality comparisons made on them will be comparing the addresses of the arrays and the pointers, not the contents of what's pointed at. To fix this, you might want to change this to read

if ( j != string("q") && k == string("q") )

which uses the string operator== function to do a true deep comparison.

It is not clear why you are using string rather than char for the array entries and the letter variables. Eg

char f = 'q';
char getletter();  
char cipherarray[5][5]= {
        {'a','f','k','p','v'},
        {'b','g','l','r','w'},
        {'c','h','m','s','x'},
        {'d','i','n','t','y'},
        {'e','j','o','u','z'}

    };

If you change all the string literals to single character literals and so on, you will avoid having to understand pointer semantics for this problem. Expressions such as:

if ( j != 'q' && k == 'q' )

will then just work.

我只是设置了一个变量,每次循环运行时该变量都会增加一个。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM