c - 查找字符串中字符的结尾

标签 c caesar-cipher

我正在编写一个凯撒密码,它将数组中每个字符的值移动一个设定的量。我遇到的问题是我的字符串之后的 char 值也被移动了。 我希望完全忽略这些值/不打印它们。

我在下面编译了以下内容,但我也想不出如何不解析尾随字符。我的加密函数必须采用这些确切的参数,因此我也无法将长度传递给它。

#include <stdio.h>

void encrypt(char *message, int shift);

int main(void)
{
    int shift_amount;
    int length;
    char message[80];
    char c;

    printf("Enter message to be encrypted: ");
    for (length = 0; ( c = getchar()) != '\n'; length++) {
        message[length] = c;
    }

    printf("Enter shift amount (1-25): ");
    scanf("%d", &shift_amount);

    encrypt(message, 3);

    return 0;
}

void encrypt(char *message, int shift){
    printf("Encrypted message: ");
    for (int i = 0; i < 80; i++) {
        char ch = message[i];

        if (message[i] >= 'a' && message[i] <= 'z') {
            ch = (( ch - 'a' ) + shift) % 26 + 'a';
        } else if (message[i] >= 'A' && message[i] <= 'Z') {
            ch = (( ch - 'A' ) + shift) % 26 + 'A';
        }
        printf("%c", ch);
    }
    printf("\n");
}

理想的示例输入/输出是:

输入:“继续吧,让我开心。”移动 3

输出:“Jr dkhdg,pdnh pb gdb。”

谢谢!

最佳答案

与其修改恰好 80 个字符,不如在到达字符串末尾时停止。你怎么知道字符串的结尾是什么时候?因为字符串末尾后的第一个字符将是字符串终止符,即 '\0' .

在您的代码中,您可以通过替换 for 来做到这一点条件,来自 i<80message[i] != '\0' ,或者如果您还想指定最大长度,请同时使用这两个条件,以确保万无一失。

我现在意识到你的字符串根本没有终止符。当你从控制台读取字符时,你应该放一个:

printf("Enter message to be encrypted: ");
for (length = 0; ( c = getchar()) != '\n'; length++) {
    message[length] = c;
}
message[length] = '\0'; // <- add this here 

关于c - 查找字符串中字符的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509980/

相关文章:

c - 在c中编辑字符串数组

c - 如何使用 Perl/其他东西搜索和替换 C 源代码中的特定代码行?

c - 为什么GDB和Objdump的指令地址是一样的?

用于加密/解密段落的凯撒密码程序

c - 输出中出现奇怪的字符

c - 段错误spoj协助

c++ - 编译器是否能够对从 dll 导入的函数进行程序集成?

c - 凯撒密码的实现有什么问题?

c - 不接受用户输入的其他选项

python - 凯撒密码加密,无法打印最终消息