【问题标题】:Unknown characters being displayed while printing character array打印字符数组时显示未知字符
【发布时间】:2017-11-08 18:47:52
【问题描述】:

我正在用 C 语言创建凯撒密码,但在显示编码消息时遇到了问题。如果消息由很少的字符组成,但只要消息超过一定数量的字符,printf 函数就会开始显示我认为是垃圾字节的未知字符。有什么想法吗?

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *concat(const char *s1, const char *s2)
{
    /*
        Remember to free allocated memory
    */
    char *result;
    if((result = malloc(strlen(s1)+strlen(s2)+1)) != NULL)
    {
        result[0] = '\0';
        strcat(result, s1);
        strcat(result, s2);
    }

    return result;
}

void encode(const char *alpha, const char *message)
{
    char result[(sizeof(message) / sizeof(char))];
    int x, y, z;

    memset(result, '\0', sizeof(result));
    for(x = 0; x < strlen(message); x++)
    {
        for(y = 0; y < 25; y++)
        {
            if(alpha[y] == message[x])
            {
                z = (y + 3);
                if(z > 25)
                {
                    z = z % 25;
                }

                result[x] = alpha[z];
            }
        }
    }

    printf("%s\n", result);

    //return result;
}

int main()
{
    char message[200];
    char *result;
    char array[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' };

    printf("Input your message:");
    scanf("%s", &message);

    encode(array, message);
}

结果:

【问题讨论】:

  • scanf("%s", &amp;message); 是错误的。应该是scanf("%s", message);
  • 刚刚更正了,谢谢。我对 C 很陌生
  • 尽量不要在循环中调用strlen for(x = 0; x

标签: c caesar-cipher


【解决方案1】:

改变

char result[(sizeof(message) / sizeof(char))];

char result[strlen(message) + 1];

这会在缓冲区中为terminating null-character 留出空间。 sizeof 也不能用于获取 c-strings 的长度,我们需要使用 strlen。您还需要更新memset 调用。

sizeof 被编译器使用,所以在这种情况下你会问你的编译器“message 的大小是多少”,在这种情况下是 8(假设是 64 位),因为指针是8 个字节。

除此之外你应该小心scanf,因为你读了一行输入,但如果你尝试再读一行,你可能会run into trouble

如 cmets 中所述,for(x = 0; x &lt; strlen(message); x++) 每次循环迭代运行一次 strlen,这给您的程序增加了相当大的额外负载,随着message 的长度增加,该负载呈指数增长。

您的concat 函数未使用,不确定您为什么包含它?

【讨论】:

  • 啊,我的错是忘记为空字节终止符分配空间,谢谢。
  • @JosephHarris 空字节不是问题。问题是您正在获取指针的大小,它可能是 4 或 8,并且完全与字符串的长度无关。
  • 啊所以 sizeof 只会返回实际指针的大小,以便找到字符串的实际长度 strlen 是合适的。
  • 我在篡改它,然后我意识到它没有用但还没有删除它。
  • sizeof 不被预处理器评估。它在实际编译期间得到评估。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多