printf 不打印最后一个字符

printf not printing last character

我正在编写一个简单的代码来模拟凯撒的密码,但我遇到了一个奇怪的错误,虽然输出字符串 fraseout[] 的格式正确并且在最后一次打印时正确打印它得到它是最后一个字符被修剪。为什么会这样?

#include <stdio.h>
#include <string.h>
#include <math.h>
int main (void)
{
        printf("Insira a frase:\n");
        char frase [256];
        scanf("%s", frase);
        int size = (int)strlen(frase);
        printf("Insira o tamanho da divergência: \n");
        int diff = 0;
        scanf("%i", &diff);
        char fraseout [size];
        int i = 0;
        for (i = 0; i<=size-1; i++)
        {
                int val = (int)frase[i];
                if (val + diff > 126)
                {
                        val = 31+diff-(126-val);
                }
                else if (val +diff < 32)
                {
                        val = 127 + diff+(val-32);
                }
                else
                {
                        val +=diff;
                }
                fraseout [i] = (char)val;
        }

        printf("\"%s\" -> \"%s\"\n", frase, fraseout);
        return 0;
}

有两个相关点,

  1. 需要将大小取为strlen()+ 1,因为strlen()没有考虑终止空值。
  2. 需要将 fraseout[i] 最后一个元素设为 0'[=14=]' 以使其可用作 字符串 .

fraseout 的长度不足以容纳 NULL 终止字节,因此您需要将其变大:

char fraseout [size+1];

此外,在构建 fraseout 之后,您需要确保它以 NULL 终止,否则您将打印垃圾:

fraseout[size] = '[=11=]';