2009-09-08 80 views
13

Tôi đang học C và tôi đang sử dụng "getchar()" để ngăn chặn các cửa sổ lệnh để tôi có thể thấy các bài tập đang làm nhưng nó không hoạt động. heres một mẫu:Tại sao không getchar() chờ tôi nhấn enter sau khi scanf()?

#include <stdio.h> 

int main() 
{ 
    int value; 
    printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
    scanf("%d", &value); 
    switch (value) 
    { 
     case 1: 
      printf("you selected the option 1."); 
      break; 
     case 2: 
      printf("you selected the option 2."); 
      break; 
     case 3: 
      printf("you selected the option 3."); 
      break; 
     case 4: 
      printf("goodbye"); 
      break; 
     default: 
      printf("thats not an option"); 
      break; 
    } 
    getchar(); 
    return 0; 
} 

đây là kết quả:

  1. tùy chọn 1.
  2. tùy chọn 2.
  3. tùy chọn 3.
  4. Exit.

Thực hiện một lựa chọn: 1

bạn chọn tùy chọn 1.

Process trở 0 (0x0) thời gian thực hiện: 3,453 s

Nhấn phím bất kỳ để tiếp tục.

Tại sao nó không đợi đầu vào của "getchar()"?

+0

Xem http://stackoverflow.com/questions/1384073/problem-with-flushing-input-stream-c/1384089. –

Trả lời

2

Có thể getchar lấy lại vận chuyển mà bạn nhập sau 1 không?

+0

Có, getchar() là nhận được dòng mới mà chấm dứt đầu vào, và do đó nó không chờ đợi lâu kể từ khi dữ liệu đã có trong bộ đệm của nó. –

+0

Heck nếu điều đó là sai. Tôi thích câu trả lời fflush và thử nó ra. –

+1

Chắc chắn những người fflush đã được rright. –

21

Scanf của bạn chỉ ăn số mà không phải là dòng mới. Đặt một dòng mới hoặc khoảng trắng sau khi% d sẽ cho bạn vấn đề ngược lại, đọc quá xa.

Đây là lý do mọi người không thích scanf.

Tôi khuyên bạn nên đọc một dòng thực tế (sử dụng fgets(3)) và sau đó sử dụng sscanf() để quét chuỗi.

-9

để chương trình của bạn hoạt động, bạn nên "tuôn" luồng đầu vào của mình trước khi gọi hàm getchar() với lệnh gọi hàm fflush (stdin). Điều này có nghĩa là khi bạn nhập vào bàn phím một số và sau đó là phím trả về, bộ đệm đầu vào sẽ lấy cả hai ký tự, ví dụ '1' và '\ n', và cuộc gọi của bạn để quét chỉ nhận được '1' để ' \ n 'vẫn còn trong bộ đệm đầu vào. Khi bạn gọi getchar, bạn là "gettin" còn lại '\ n'. Việc xóa đầu vào sẽ loại bỏ tất cả bộ đệm.

+3

'fflush (stdin)' là _undefined behavior_. Đừng làm thế. –

+0

sau đó làm thế nào tôi nên làm điều đó? am thực sự mới này, đến từ python như ngôn ngữ lập trình đầu tiên của tôi vì vậy tất cả mọi thứ về quản lý bộ nhớ là Trung Quốc với tôi .. –

+1

wow .. Tôi không biết .. chỉ cần thực hiện một số nghiên cứu và tìm thấy lời giải thích này http: // www.gidnetwork.com/b-57.html – nairdaen

2

Các getchar() được đọc \ n từ bàn phím trong scanf - xem here để biết thêm

1

Tôi nghĩ rằng bạn nhập vào một nhập sau khi nhập "1". Nó sẽ được chấp nhận bởi getchar(). Do đó, bạn có thể giải quyết vấn đề chỉ bằng cách thêm getchar() bổ sung sau bản gốc (ngay trước return 0;).

** Tôi đã thử nghiệm tính năng này và hoạt động.

8

Trước hết, hãy không sử dụng fflush() để xóa luồng đầu vào; hành vi không được xác định:

7.19.5.2.2 Nếu luồng chỉ đến luồng đầu ra hoặc luồng cập nhật trong đó hoạt động gần đây nhất không được nhập, hàm fflush sẽ làm cho bất kỳ dữ liệu không được ghi nào cho luồng đó sẽ được gửi tới môi trường máy chủ được ghi vào tệp; nếu không, hành vi là không xác định.

Vấn đề là dòng mới không được tiêu thụ bởi công cụ chỉ định chuyển đổi "% d", vì vậy nó được chọn ngay lập tức bởi getchar(). Không có cách nào tốt nhất để giải quyết vấn đề này, nhưng nói chung cách tiếp cận là đọc toàn bộ dòng dưới dạng văn bản (bằng cách sử dụng fgets() hoặc scanf() với trình định dạng chuyển đổi "% s" có kích thước), sẽ tiêu thụ dòng mới, sau đó chuyển sang mục tiêu loại dữ liệu sử dụng sscanf() hoặc strtol() hoặc strtod().

-2
#include <stdio.h> 
#include<conio.h> 
void main() 
{ 
    int value; 
    printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
    scanf("%d", &value); 
    switch (value) 
    { 
     case 1: 
      printf("you selected the option 1."); 
      break; 
     case 2: 
      printf("you selected the option 2."); 
      break; 
     case 3: 
      printf("you selected the option 3."); 
      break; 
     case 4: 
      printf("goodbye"); 
      break; 
     default: 
      printf("thats not an option"); 
      break; 
    } 
    getch(); 
} 
+0

Vì vậy, câu trả lời của bạn là sử dụng 'getch' thay thế? Bạn có thể làm cho rõ ràng hơn (nếu nó thực sự là trường hợp)? –

2

bạn đang nhận được một trở về vận chuyển, cách tôi sẽ nhận được xung quanh nó, xác định một char và chỉ có nó quét trở về vận chuyển,

char ch; (trước khi getch() của bạn nhập sau) scanf("%c",&ch); getchar();

nên hoạt động theo cách này, không phải là cách hiệu quả nhất để làm việc này nhưng phù hợp với tôi.

1

Như đã đề cập, scanf sẽ rời khỏi \ n sau khi đọc dữ liệu nhập của người dùng.

Linh hồn: thêm getchar() ngay sau khi scanf.

Điều đó bù đắp thiếu hụt scanf.

ví dụ:

int value; 
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
scanf("%d", &value); 
getchar(); 
switch (value) 
Các vấn đề liên quan