【发布时间】:2020-11-15 19:07:02
【问题描述】:
当我使用以下键运行代码时,会输出额外的字符...
终端窗口: $ ./substitution abcdefghjklmnopqrsTUVWXYZI 明文:heTUXWVI ii ssTt 密文:heUVYXWJ jj ttUuh|
这是说明(cs50替换问题)
设计并实现一个程序,替代,使用替代密码加密消息。
在 ~/pset2/substitution 目录中名为substitution.c 的文件中实现您的程序。 您的程序必须接受一个命令行参数,即用于替换的键。键本身应该不区分大小写,因此键中的任何字符是大写还是小写都不应影响程序的行为。 如果您的程序在没有任何命令行参数或多个命令行参数的情况下执行,您的程序应该打印您选择的错误消息(使用 printf)并从 main 返回值 1(这往往表示错误) 立即地。 如果密钥无效(如不包含 26 个字符、包含任何非字母字符或每个字母不只包含一次),您的程序应该打印您选择的错误消息(使用 printf)并从 main 返回立即值为 1。 您的程序必须输出明文:(不带换行符),然后提示用户输入明文字符串(使用 get_string)。 您的程序必须输出密文:(不带换行符)后跟明文对应的密文,明文中的每个字母字符替换密文中的对应字符;非字母字符应原样输出。 您的程序必须保留大小写:大写字母必须保持大写字母;小写字母必须保持小写字母。 输出密文后,你应该打印一个换行符。然后你的程序应该通过从 main 返回 0 来退出。
我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc,string argv[])
{
char alpha[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'};
string key = argv[1];
int totalchar = 0;
for (char c ='a'; c <= 'z'; c++)
{
for (int i = 0; i < strlen(key); i++)
{
if (tolower(key[i]) == c)
{
totalchar++;
}
}
}
//accept only singular 26 key
if (argc == 2 && totalchar == 26)
{
string plaint = get_string("plaintext: ");
int textlength =strlen(plaint);
char subchar[textlength];
for (int i= 0; i< textlength; i++)
{
for (int j =0; j<26; j++)
{
// substitute
if (tolower(plaint[i]) == alpha[j])
{
subchar[i] = tolower(key[j]);
// keep plaintext's case
if (plaint[i] >= 'A' && plaint[i] <= 'Z')
{
subchar[i] = (toupper(key[j]));
}
}
// if isn't char
if (!(isalpha(plaint[i])))
{
subchar[i] = plaint[i];
}
}
}
printf("ciphertext: %s\n", subchar);
return 0;
}
else
{
printf("invalid input\n");
return 1;
}
}
【问题讨论】:
-
您需要放置您收到的错误的确切文本,否则其他人将无法找到此问题。还请提供一个最小的可行示例,而不是仅仅粘贴您的整个代码。 Stack Overflow 旨在成为可查询问题的动态文档,而不是通用的“我的代码出了什么问题”论坛。请牢记这些参数修改您的问题。
标签: string error-handling comparison cs50 substitution