2015-01-22 2 views
0

Я пишу некоторые простые программы на языке C, чтобы выучить язык, и до сих пор я думаю, что начинаю основываться, но натолкнулся на странное поведение, которое я не понимаю. Может ли кто-нибудь сказать мне, что здесь не так, и как это исправить?Устранение непреднамеренного поведения строки в C

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

int main() { 
    const unsigned int MAX_LENGTH = 20; 
    char str[MAX_LENGTH]; 
    unsigned int len = 0, i, j; 

    for (i = 0; i < MAX_LENGTH; i++) { 
     str[i] = getchar(); 

     if (strncmp(&str[i], "\n", 1) == 0) { 
      break; 
     } 

     len++; 
    } 

    for (i = 1; i < len; i++) { 
     char whitespace[len]; 

     for (j = 0; j < i; j++) { 
      whitespace[j] = ' '; 
     } 

     printf("%s%c\n", whitespace, str[i]); 
    } 

    return 0; 
} 

Я набрал "Hello World!" в качестве входных данных для обхвата getchar() метода, и я ожидал, что консоль выглядеть примерно так:

Hello World! 
e 
    l 
    l 
    o 

     W 
     o 
     r 
     l 
      d 
      ! 

Но вместо этого я получил эту тарабарщину:

Hello World! 
;oQ?e 
    oQ?l 
    Q?l 
    ?o 

     W 
     o 
     X?Pr 
     ?Pl 
      Pd 
      ! 
+0

Почему код с помощью ', если (strncmp (& ул [I], "\ п", 1) == 0)' вместо ', если (str [i] == '\ n') '? Возможно, что-то мне не хватает. – chux

+0

Ах спасибо, что указали это. Как я уже сказал, я новичок, поэтому я попробовал '' str [i] == "\ n" '', и когда сборка крикнула на меня, я просмотрел строку сравнения и нашел этот метод. –

ответ

2

whitespace массива не нуль.

добавить нулевой терминатор после цикла for, так как

for (j = 0; j < i; j++) { 
     whitespace[j] = ' '; 
    } 
whitespace[j] = `\0`; 
+0

ОН, спасибо! Я должен был понять, что –

+0

Я только что испытал, и это работает. Если вы не возражаете, я спрашиваю, зачем его нужно присваивать индексу '' j''th, когда пробел уже находится в этом индексе? Я бы подумал, что он перезапишет пробелы, но это не так. –

+0

Ох, конечно, '' j'' приращивается к '' i'' в этот момент. –

Смежные вопросы