C语言 将给定的密码argv应用于用户输入



我试图写一个函数,在变量密码,用户输入,字母表和输出替换字母。例如,在执行时,它接受一个参数argv ZYXWVUTSRQPONMLKJIHGFEDCBA。请求用户输入任何东西,然后只切换字母,例如输入aBc应该输出zYx

// function that takes in cipher(c), userinput(u) and alphabet(a) and outputs cipher text
void cipher_text(string c, string u, string a)
{
string result = u;
for (int i = 0; i < strlen(u); i++)
{
for (int k = 0; k < strlen(a); k++)
{
if (tolower(u[i]) == a[k])
{
if(islower(u[i]))
{
result[i] = tolower(c[k]);
printf("%s   %sn",result,c);
}
else
{
result[i] = toupper(c[k]);
}
}
}
}
// printf("ciphertext:  %sn", result);
}

密码为YUKFRNLBAVMWZTEOGXHCIPJSQDuserinput为abcd

我正等着你呢

这个函数的问题在于这个内部for循环

for (int k = 0; k < strlen(a); k++)
{
if (tolower(u[i]) == a[k])
{
if(islower(u[i]))
{
result[i] = tolower(c[k]);
printf("%s   %sn",result,c);
}
else
{
result[i] = toupper(c[k]);
}
}
}

只要在指针a所指向的字符串中找到一个字母,就需要将其断开。否则会有一连串的更改。

同样使用strlen函数是低效和冗余的。

可以使用标准函数strchr代替for循环。

函数可以按照以下方式声明和定义

string cipher_text( string c, string u, string a )
{
for ( string p = u; *p != ''; p++ )
{
string pos = strchr( a, tolower( ( unsigned char )*p ) );
if ( pos != NULL )
{
size_t i = pos - a;
*p = islower( ( unsigned char )*p )
? tolower( c[i] )
: c[i];
}
}
return u;
}

请注意,与其使用类型定义名称string,不如使用其底层类型char *

在这种情况下,函数可以如下面的演示程序所示。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
char * cipher_text( const char *c, char *u, const char *a )
{
for (char *p = u; *p != ''; p++)
{
const char *pos = strchr( a, tolower( ( unsigned char )*p ) );
if (pos != NULL)
{
size_t i = pos - a;
*p = islower( ( unsigned char )*p )
? tolower( c[i] )
: c[i];
}
}
return u;
}
int main( void )
{
const char *c = "XYZ";
const char *a = "abc";
char u[] = "c_B_a";
puts( cipher_text( c, u, a ) );
}

程序输出为

z_Y_x

相关内容

  • 没有找到相关文章