2015-09-15 6 views
2

Я делаю простой код для моделирования Cypher Цезаря, и у меня возникает странная ошибка, хотя строка вывода fraseout[] сформирована правильно и будет правильно печататься на самом последнем принте, которое она получает последним персонаж обрезанный. Почему это происходит?printf not printing last character

#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; 
} 
+0

Что говорит вам ваш отладчик? –

+2

Используйте 'int size = (int) strlen (frase) + 1;' – ouah

+2

'char fraseout [size];' -> 'char fraseout [size + 1];' и вы не закончили 'fraseout'. –

ответ

1

fraseout не достаточно долго удерживать NULL завершающего байт, так что вам нужно сделать это один больше:

char fraseout [size+1]; 

Кроме того, после строительства fraseout, вы должны убедиться, что это NULL прекращается, в противном случае вы будете печатать мусор:

fraseout[size] = '\0'; 
1

Есть две связанные точки,

  1. нужно взять размер как strlen() + 1, как strlen() не учитывает завершающий нуль.
  2. нужно сделать fraseout[i], последний элемент, как 0 или '\0', чтобы сделать его пригодным для использования в качестве строки.