2013-10-14 21 views
5

Tôi đang đọc K & R's Ngôn ngữ lập trình C và đã trở nên nhầm lẫn trên putchar và getchar. Tôi đã thực hiện một chương trình mà bạn nhập 10 ký tự và chương trình in chúng trở lại màn hình.Putchar và Getchar trong C

#include <stdio.h> 

int main() 
{ 
    int i; 
    int ch; 
    for(i = 0; i < 10; i++) 
    { 
     printf("Enter a single character >> "); 
     ch = getchar(); 
     putchar(ch); 
    } 

    return 0; 
} 

tôi mong đợi để có được một kết quả như thế này:

Enter a single character >> a 
a 
Enter a single character >> b 
b 

... và vân vân 10 lần nhưng đây là sản phẩm tôi nhận: (tôi dừng lại sau khi nhập 2 ký tự)

Enter a single character >> a 
aEnter a single character >> 
Enter a single character >> b 
bEnter a single character >> 
Enter a single character >> 

không chắc chắn lý do ký tự đầu vào của tôi được kết hợp với chuỗi cố định và đầu ra.

Ngoài ra, tôi không chắc chắn lý do tại sao int được sử dụng để lưu trữ các ký tự.

Trả lời

4
putchar(ch); 

chỉ in ký tự đơn và sau printf tiếp tục trong cùng một dòng. Chỉ cần thêm:

putchar('\n'); 

ngay sau khi putchar(ch);, sẽ dứt khoát bắt đầu dòng mới trước khi printf được thực thi. Ngoài ra bạn cũng nên dùng '\n' từ đầu vào mà vẫn ở đó sau khi bạn nhập ký tự:

for(i = 0; i < 10; i++) 
{ 
    printf("Enter a single character >> "); 
    ch = getchar(); 
    getchar();  // <-- "eat" new-line character 
    putchar(ch); 
    putchar('\n'); // <-- start new line 
} 
+1

Cảm ơn bạn đã trả lời nhưng mã vẫn không hoạt động, "Nhập một ký tự đơn >>" vẫn được in hai lần khi không được. Nếu bạn nhìn vào bài viết chính của tôi và khối mã cuối cùng bạn có thể thấy trên dòng thứ hai ý tôi, char a đã được nối với chuỗi "Enter a single character >>" và sau đó là "Enter a single character >> "chuỗi được in ngay lập tức vào màn hình. –

+0

@CSStudent: Tôi hiểu. Kiểm tra câu trả lời của tôi ngay bây giờ :) – LihO

4

Bạn không in dòng mới. Sau putchar(ch); bạn nên sử dụng putchar('\n'); để in một dòng mới.

+1

Cảm ơn bạn đã trả lời nhưng mã vẫn không hoạt động, "Nhập một ký tự đơn >>" vẫn còn in hai lần khi nó shouldn không. Nếu bạn nhìn vào bài viết chính của tôi và khối mã cuối cùng bạn có thể thấy trên dòng thứ hai ý tôi, char a đã được nối với chuỗi "Enter a single character >>" và sau đó là "Enter a single character >> "chuỗi được in ngay lập tức vào màn hình. –

2

tài terminal có thể hoạt động trong chế độ kinh điển và phi kinh điển. Theo mặc định, nó hoạt động ở chế độ chuẩn và điều này có nghĩa là đầu vào tiêu chuẩn có sẵn cho một chương trình theo từng dòng (không phải biểu tượng theo biểu tượng). Trong câu hỏi người dùng nhập một cái gì đó (để cho nó được chữ 'a', 0x61 trong hex) và đẩy nhập (ký tự dòng mới '0x0A' trong hex). Bảng Ascii là here. Vì vậy, hành động này cung cấp cho một hai biểu tượng cho một chương trình. Như đã đề cập trong man getchar() đọc nó biểu tượng-by-symbol. Vì vậy, vòng lặp lặp lại hai lần cho một ký tự. Để xem những gì đang xảy ra sử dụng các chương trình sau đây (+ loop truy cập đầu ra, + nhân vật mã đầu ra):

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    int i; 
    char ch; 
    for(i = 0; i < 10; i++) 
    { 
    printf("Enter a single character %d >>", i); 
    ch = getchar(); 
    printf("Ch=0x%08X\n", ch); 
    /*putchar(ch);*/ 
    } 

    return 0; 
} 

Output:

┌─(02:01:16)─([email protected])─(~/tmp/getchar) 
└─► gcc -o main main.c; ./main 
Enter a single character 0 >>a 
Ch=0x00000061 
Enter a single character 1 >>Ch=0x0000000A 
Enter a single character 2 >>b 
Ch=0x00000062 
Enter a single character 3 >>Ch=0x0000000A 
Enter a single character 4 >>^C 

Vì vậy, chương trình lấy hai biểu tượng và in chúng. Và biểu tượng dòng mới không hiển thị. Vì vậy, trong câu hỏi người dùng thấy một dòng bổ sung lạ. Mô tả chi tiết về các chế độ đầu cuối khác nhau và cách thực hiện các điều chỉnh của nó có thể được tìm thấy here.

Ngoài ra tiện ích stty có thể hữu ích khi làm việc với các tùy chọn đầu cuối ("icanon" cho biết liệu thiết bị đầu cuối có sử dụng chế độ chuẩn hay không).

Và về lưu trữ ký tự dưới dạng int trong hàm getchar() - xem answer cho chủ đề tương tự.

0

Vòng lặp trên số chẵn, getchar() không lấy đầu vào từ bàn phím, nhưng được lấy từ lần truy cập đã nhập trước đó, vì vậy bạn cũng sẽ nhận thấy vòng lặp đó chỉ được thực hiện 5 lần. Vì vậy, bạn phải xóa bộ đệm, tức là đã nhấn, để ký tự mới có thể được nhập trong ch.

for (i = 0; i < 5; i++) 
    { 
     printf("\nEnter a single character >> "); // new line 
     ch = getchar(); 
     while (getchar() != '\n'); //Clearung buffer. 
     putchar(ch); 
    } 
0

Không chắc chắn nếu lý tưởng, nhưng điều này đã làm việc:

#include <stdio.h> 
    int main() 
    { 
     int i; 
     int ch; 
     for(i = 0; i < 10; i++) 
     { 
      printf("Enter a single character >> "); 
      getchar(); 
      ch=getchar(); 
      putchar(ch); 
     } 

     return 0; 
     } 
+0

Điều này là sai. 'Getchar()' đầu tiên của bạn sẽ ăn đầu vào của người dùng và 'ch' sẽ chỉ nhận được một ký tự dòng mới – Cyril

+1

tôi thấy, cảm ơn :) –

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