2012-05-09 3 views
6

Я только начинаю с C и пробую несколько примеров из книги Ритчи. Я написал небольшую программу, чтобы понять массивы символов, но наткнулся на некоторые ошибки, и в надежде на некоторое представление о том, что я понял неправильно:C начинающий программист. Пожалуйста, объясните эту ошибку.

#include <stdio.h> 
#define ARRAYSIZE 50 
#include <string.h> 

main() { 
    int c,i; 
    char letter[ARRAYSIZE]; 
    i=0; 
    while ((c=getchar()) != EOF) 
    {  
    letter[i]=c; 
    i++; 
    } 
    letter[i]='\0'; 
    printf("You entered %d characters\n",i); 
    printf("The word is "); 

    printf("%s\n",letter); 
    printf("The length of string is %d",strlen(letter)); 
    printf("Splitting the string into chars..\n"); 
    int j=0; 
    for (j=0;j++;(j<=strlen(letter))) 
    printf("The letter is %d\n",letter[j]); 
} 

Выход:

$ ./a.out 
hello how are youYou entered 17 characters 
The word is hello how are you 
The length of string is 17Splitting the string into chars.. 

Что такое происходит? Почему цикл for не выводит?

ответ

11

Синтаксис должен быть;

for (j=0; j<strlen(letter); j++) 

С strlen это costy операция, и не изменять строку внутри цикла, то лучше написать так:

const int len = strlen(letter); 
for (j=0; j<=len; j++) 

Кроме того, он сильно Рекоммендуемый всегда проверять переполнение буфера работы с C-строками и пользовательского ввода:

while ((c=getchar()) != EOF && i < ARRAYSIZE - 1) 
+1

+1 для рекомендации проверки привязки массива –

+0

Спасибо за этот отзыв. Я скоро добавлю ошибки. Думал, что я очищу основы. Посмотрите, как я ошибся даже в синтаксисе for! :) – Droidzone

7

Ошибка в течение, просто поменять местами конечное состояние и приращение так:

for (j = 0; j <= strlen(letter); j++) 

Вопрос: это что последний символ?

+0

'j

+0

@ another.anon.coward: конечно, но я думаю, что видеть нулевой терминатор выгодно для op – BlackBear

+0

Я думаю, вы правы! ^^ –

3

правильный формат for петли:

for (initialization_expression; loop_condition; increment_expression){ 
    // statements 
} 

поэтому ваш for цикл должен быть

for (j = 0; j < strlen(letter); j++) 
4

for (j=0;j++;(j<=strlen(letter))) это не правильно.

Должно быть for (j=0; j<=strlen(letter); j++) - приращение в третьем положении.

2

В цикле for условие i ++, которое в первый раз принимает значение false (0). Вам необходимо поменять их: for (j=0; j <= strlen(letter); j++)

+0

+1: Только ответьте здесь, чтобы попытаться объяснить, почему петли не печатают какой-либо вывод –

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