CS50凯撒打印随机字符
我对这个问题有点困惑,因为我让它开始工作,提交并获得了全部学分,但是当我在循环之前打印初始变量时,代码只显示了单词。此代码适用于:CS50凯撒打印随机字符,c,cs50,caesar-cipher,C,Cs50,Caesar Cipher,我对这个问题有点困惑,因为我让它开始工作,提交并获得了全部学分,但是当我在循环之前打印初始变量时,代码只显示了单词。此代码适用于: int main(int argc, string argv[]) { // c = (p + k) % 26, where c is result text, p is input and k // is key //considers if arg count is two if (argc == 2) { in
int main(int argc, string argv[]) {
// c = (p + k) % 26, where c is result text, p is input and k
// is key
//considers if arg count is two
if (argc == 2) {
int n = strlen(argv[1]);
int check = 0;
if (isdigit(argv[1][0])) {
for (int i = 1; i < n; i++) {
if (isdigit(argv[1][i]) || argv[1][i] == '0') {
check++;
} else {
check--;
}
}
}
// verifies all characters are numeric
if (check != n - 1) {
printf("Usage: ./caesar key\n");
return 1;
}
} else {
printf("Usage: ./caesar key\n");
// returning 1 identifies an error and exits the program
return 1;
}
int key = atoi(argv[1]);
string plaintext = get_string("plaintext: ");
printf("%i\n", key);
printf("%s\n", plaintext);
int m = strlen(plaintext);
printf("%i\n", m);
char ciphertext[m];
int usekey = (key % 26);
printf("%i\n", key);
// NEED to figure out how to handle wrap around
// need to understand ASCII
for (int i = 0; i < m; i++) {
int c = plaintext[i];
//encrypts upper case letters
if (c >= 65 && c <= 90) {
//incorporates wrap around for uppercase
if (c + usekey >= 90) {
int val = 90 - c;
int key2 = usekey - val;
char cipher = 64 + key2;
ciphertext[i] = cipher;
}
//considers if key works fine
else {
char cipher = c + usekey;
ciphertext[i] = cipher;
}
}
//encrypts lower case letters
else if (c >= 97 && c <= 122) {
//incorporates wrap around for lowercase
if (c + usekey >= 122) {
int val = 122 - c;
int key2 = usekey - val;
char cipher = 96 + key2;
ciphertext[i] = cipher;
} else {
char cipher = c + usekey;
ciphertext[i] = cipher;
}
} else {
//encrypts punctuation
ciphertext[i] = c;
}
printf("*\n");
}
printf("ciphertext: %s\n", ciphertext);
}
我认为你的if条件并没有像它应该的那样有效。您可以打印“argv[1][i]”并查看问题。这是我的代码,可以帮助你
bool isNumber(char number[])
{
int i = 0;
for (; number[i] != 0; i++)
{
if (!isdigit(number[i])) //check if there is something that is not digit
{
return false;
}
}
return true;
}
int main(int argc, string argv[])
{
if (argc == 2 && isNumber(argv[1]) == 1)
{
int k = atoi(argv[1]);
string plainText, chipherText;
plainText = get_string("plaintext: ");
printf("ciphertext: ");
for (int i = 0, n = strlen(plainText) ; i < n; i++)
{
// checking if it is lowercase 97 = a to 112 = z and if it + 13 characters along.
if (plainText[i] >= 'a' && plainText[i] <= 'z')
{
printf("%c", (((plainText[i] - 'a') + k) % 26) + 'a'); // print out lowercase with key
} // if it it between uppercase A and Z
else if (plainText[i] >= 'A' && plainText[i] <= 'Z')
{
printf("%c", (((plainText[i] - 'A') + k) % 26) + 'A'); // print out uppercase with key
}
else
{
printf("%c", plainText[i]);
}
}
printf("\n");
return 0;
}
else if (argc != 2 || isNumber(argv[1]) == 0)
{
printf("Error\n");
return 1;
}
}
bool-isNumber(字符号[])
{
int i=0;
for(;number[i]!=0;i++)
{
if(!isdigit(number[i])//检查是否有非数字的内容
{
返回false;
}
}
返回true;
}
int main(int argc,字符串argv[])
{
如果(argc==2&&isNumber(argv[1])==1)
{
int k=atoi(argv[1]);
字符串明文,chipherText;
明文=获取字符串(“明文:”);
printf(“密文:”);
for(int i=0,n=strlen(纯文本);i 如果(纯文本[i]>='a'&&plainText[i]='a'&&plainText[i]我认为你的if条件并没有像它应该的那样工作。你可以打印'argv[1][i]'并查看问题。这是我的代码,可以帮助你
bool isNumber(char number[])
{
int i = 0;
for (; number[i] != 0; i++)
{
if (!isdigit(number[i])) //check if there is something that is not digit
{
return false;
}
}
return true;
}
int main(int argc, string argv[])
{
if (argc == 2 && isNumber(argv[1]) == 1)
{
int k = atoi(argv[1]);
string plainText, chipherText;
plainText = get_string("plaintext: ");
printf("ciphertext: ");
for (int i = 0, n = strlen(plainText) ; i < n; i++)
{
// checking if it is lowercase 97 = a to 112 = z and if it + 13 characters along.
if (plainText[i] >= 'a' && plainText[i] <= 'z')
{
printf("%c", (((plainText[i] - 'a') + k) % 26) + 'a'); // print out lowercase with key
} // if it it between uppercase A and Z
else if (plainText[i] >= 'A' && plainText[i] <= 'Z')
{
printf("%c", (((plainText[i] - 'A') + k) % 26) + 'A'); // print out uppercase with key
}
else
{
printf("%c", plainText[i]);
}
}
printf("\n");
return 0;
}
else if (argc != 2 || isNumber(argv[1]) == 0)
{
printf("Error\n");
return 1;
}
}
bool-isNumber(字符号[])
{
int i=0;
for(;number[i]!=0;i++)
{
if(!isdigit(number[i])//检查是否有非数字的内容
{
返回false;
}
}
返回true;
}
int main(int argc,字符串argv[])
{
如果(argc==2&&isNumber(argv[1])==1)
{
int k=atoi(argv[1]);
字符串明文,chipherText;
明文=获取字符串(“明文:”);
printf(“密文:”);
for(int i=0,n=strlen(纯文本);i if(明文[i]>='a'和明文[i]='a'和明文[i]您为cyphertext
分配m
字节,这对于空终止符是不够的,您也没有设置空终止符,导致加密输出后出现随机字符。这实际上是未定义的行为,因此可能发生任何情况,包括程序崩溃
您不需要存储加密文本,只需一次输出一个字节即可。
也不要使用ASCII值,例如65
和90
,使用可读性更高的字符常量'A'
和'Z'
以下是一个简化版本:
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
int main(int argc, string argv[]) {
if (argc != 2) {
printf("Usage: ./caesar key\n");
// returning 1 identifies an error and exits the program
return 1;
}
char *p;
int key = strtol(argv[1], &p, 10);
if (*p || p == argv[1]) {
printf("caesar: invalid argument: %s\n", argv[1]);
return 1;
}
string plaintext = get_string("plaintext: ");
// assuming ASCII
for (size_t i = 0; plaintext[i]; i++) {
int c = plaintext[i];
if (c >= 'A' && c <= 'Z') {
c = 'A' + (c - 'A' + key) % 26;
} else
if (c >= 'a' && c <= 'z') {
c = 'a' + (c - 'a' + key) % 26;
}
putchar(c);
}
putchar('\n');
free(plaintext);
return 0;
}
#包括
#包括
#包括
int main(int argc,字符串argv[]){
如果(argc!=2){
printf(“用法:./caesar key\n”);
//返回1标识错误并退出程序
返回1;
}
char*p;
int key=strtol(argv[1],&p,10);
if(*p | | p==argv[1]){
printf(“caesar:无效参数:%s\n”,argv[1]);
返回1;
}
字符串明文=获取字符串(“明文:”);
//假设ASCII
对于(大小i=0;纯文本[i];i++){
int c=纯文本[i];
如果(c>='A'&&c='A'&&c为cyphertext
分配m
字节,这对于空终止符来说是不够的,您也没有设置空终止符,导致加密输出后出现随机字符。这实际上是未定义的行为,因此任何情况都可能发生,包括程序崩溃
您不需要存储加密文本,只需一次输出一个字节即可。
也不要使用ASCII值,例如65
和90
,使用可读性更高的字符常量'A'
和'Z'
以下是一个简化版本:
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
int main(int argc, string argv[]) {
if (argc != 2) {
printf("Usage: ./caesar key\n");
// returning 1 identifies an error and exits the program
return 1;
}
char *p;
int key = strtol(argv[1], &p, 10);
if (*p || p == argv[1]) {
printf("caesar: invalid argument: %s\n", argv[1]);
return 1;
}
string plaintext = get_string("plaintext: ");
// assuming ASCII
for (size_t i = 0; plaintext[i]; i++) {
int c = plaintext[i];
if (c >= 'A' && c <= 'Z') {
c = 'A' + (c - 'A' + key) % 26;
} else
if (c >= 'a' && c <= 'z') {
c = 'a' + (c - 'a' + key) % 26;
}
putchar(c);
}
putchar('\n');
free(plaintext);
return 0;
}
#包括
#包括
#包括
int main(int argc,字符串argv[]){
如果(argc!=2){
printf(“用法:./caesar key\n”);
//返回1标识错误并退出程序
返回1;
}
char*p;
int key=strtol(argv[1],&p,10);
if(*p | | p==argv[1]){
printf(“caesar:无效参数:%s\n”,argv[1]);
返回1;
}
字符串明文=获取字符串(“明文:”);
//假设ASCII
对于(大小i=0;纯文本[i];i++){
int c=纯文本[i];
如果(c>='A'&&c='A'&&c缺少零终止符?可能会:char-ciphertext[m+1];ciphertext[m]='\0';/*没有更多的更改*/
关于:int n=strlen(argv[1]);
1)函数:strlen返回一个size\t
NOT Aint
.2)从strlen返回的值
是NUL终止字节的索引,索引从0开始,而不是1。2)关于:for(int i=1;i
这跳过了检查命令行参数的第一个字符。建议:for(size_t i=0;i是卷积代码:if(isdigit(argv[1][i])| argv[1][i]=“0”){check++;}否则{check-->}
可以替换为:if(isdigit(argv[1][i]){check++;}
和if(check!=n-1)
替换为:if(check!=n)
然后删除:if(isdigit)(argv[1][0])){
关于否则如果(c>=97&&c='a'&&c缺少零终止符?可能会这样做:char-ciphertext[m+1];ciphertext[m]='\0';/*没有更多更改*/
关于:int-n=strlen(argv[1])
1)函数:strlen返回size\t
而不是int
.2)strlen()
返回的值是NUL终止字节的索引,索引从0开始,而不是1。2)关于:for(int i=1;i
这跳过检查命令行参数的第一个字符。建议:for(size_t i=0;i是卷积代码:if(isdigit(argv[1][i])| argv[1][i]=='0'){check++;}