Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CS50凯撒打印随机字符_C_Cs50_Caesar Cipher - Fatal编程技术网

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(纯文本);iif(明文[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 A
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++;}否则{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++;}