2012-05-09 34 views
6

Tôi mới bắt đầu với C và đã thử một vài ví dụ từ cuốn sách của Ritchie. Tôi đã viết một chương trình nhỏ để hiểu mảng ký tự, nhưng vấp phải một số lỗi, và đã hy vọng cho một số cái nhìn sâu sắc về những gì tôi đã hiểu sai:Người mới bắt đầu lập trình C - Vui lòng giải thích lỗi này

#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]); 
} 

Đầu ra là:

$ ./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.. 

là gì xảy ra? Tại sao vòng lặp for không đưa ra bất kỳ đầu ra nào?

Trả lời

11

Cú pháp phải là;

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

Kể từ strlen là hoạt động costy, và bạn không sửa đổi các chuỗi bên trong vòng lặp, nó tốt hơn để viết như:

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

Bên cạnh đó, nó recommanded mạnh mẽ để luôn kiểm tra các lỗi tràn bộ đệm khi làm việc với C-strings và sử dụng đầu vào:

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

+1 để đề xuất kiểm tra ràng buộc mảng –

+0

Cũng xin cảm ơn mẹo đó. Tôi sẽ sớm kiểm tra lỗi. Nghĩ rằng tôi sẽ xóa những điều cơ bản. Xem cách tôi đã sai ngay cả trong cú pháp của! :) – Droidzone

7

Lỗi này là trong cho, chỉ đơn giản là trao đổi các điều kiện chấm dứt và thặng dư như thế này:

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

Câu hỏi: mà ký tự cuối cùng là gì?

+0

'j

+0

@ another.anon.coward: tất nhiên, nhưng tôi nghĩ rằng nhìn thấy terminator null là có lợi cho op – BlackBear

+0

Tôi đoán bạn đã đúng! ^^ –

3

Định dạng đúng của for vòng lặp là:

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

nên for vòng lặp của bạn nên

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

for (j=0;j++;(j<=strlen(letter))) đó là không đúng.

Nó phải là for (j=0; j<=strlen(letter); j++) - tăng ở vị trí thứ ba.

2

Trong vòng lặp for, điều kiện là i ++, lần đầu tiên đánh giá sai (0). Bạn cần trao đổi chúng: for (j=0; j <= strlen(letter); j++)

+0

+1: Chỉ trả lời ở đây cho đến nay mà cố gắng giải thích lý do tại sao các vòng lặp không in bất kỳ đầu ra nào –

Các vấn đề liên quan