2013-01-23 42 views
8

Tôi đang cố gắng tạo một chương trình C đơn giản cho một lớp và một trong các yêu cầu là tôi bắt buộc phải sử dụng scanf/printf cho tất cả đầu vào và đầu ra. Câu hỏi của tôi là tại sao nó là scanf của tôi sau khi vòng lặp for trong chính bị bỏ qua và chương trình chỉ chấm dứt.scanf Bắt Bỏ qua

Đây là mã của tôi

#include <stdio.h> 

void main() { 
    int userValue; 
    int x; 
    char c; 

    printf("Enter a number : "); 
    scanf("%d", &userValue); 
    printf("The odd prime values are:\n"); 
    for (x = 3; x <= userValue; x = x + 2) { 
     int a; 
     a = isPrime(x); 
     if (a = 1) { 
      printf("%d is an odd prime\n", x); 
     } 
    } 
    printf("hit anything to terminate..."); 
    scanf("%c", &c);  
} 

int isPrime(int number) { 
    int i; 
    for (i = 2; i < number; i++) { 
     if (number % i == 0 && i != number) 
      return 0; 
    } 
    return 1; 
} 

tôi đã có thể "sửa chữa" nó bằng cách thêm một giống scanf sau khi người đầu tiên, nhưng tôi muốn chỉ cần sử dụng một trong các.

+1

Bạn đã thử 'hệ thống (" PAUSE ");'? –

+0

là có sẵn trong C thẳng hoặc chỉ C + +? –

+0

Staight c. Lưu ý việc thiếu một không gian tên? –

Trả lời

19

Ký tự dòng mới có trong stdin sau int trước đó đã được nhập sẽ không bị tiêu thụ bởi lệnh gọi cuối cùng đến scanf(). Vì vậy, các cuộc gọi đến scanf() sau khi vòng lặp for tiêu thụ ký tự dòng mới và tiếp tục mà không cần người dùng phải nhập bất cứ điều gì.

Để sửa mà không phải thêm một số khác scanf() gọi bạn có thể sử dụng định dạng số " %c" trong số scanf() sau vòng lặp for. Điều này sẽ làm cho scanf() bỏ qua bất kỳ ký tự trắng khoảng trắng nào (bao gồm cả dòng mới). Lưu ý nó có nghĩa là người dùng sẽ phải nhập một cái gì đó khác với một dòng mới để kết thúc chương trình.

Ngoài ra:

  • kiểm tra kết quả của scanf() để đảm bảo nó thực sự gán một giá trị cho các biến chuyển trong:

    /* scanf() returns number of assigments made. */ 
    if (scanf("%d", &userValue) == 1) 
    
  • đây là một bài tập (và sẽ luôn luôn đúng) :

    if (a = 1){ /* Use == for equality check. 
           Note 'a' could be removed entirely and 
           replace with: if (isPrime(x)) */ 
    
+1

Tại sao nó không được tiêu thụ bởi cuộc gọi cuối cùng tới 'scanf()'? Xin lỗi câu hỏi newb –

+2

@SSHThis, 'scanf ("% d ")' ngừng tiêu thụ khi gặp phải một thứ không phải là chữ số, và dòng mới không phải là chữ số để nó vẫn còn. – hmjd

+0

cảm ơn vì đã gặp lỗi đó –