2012-01-30 21 views
5

Ok, tôi là một noob với C, nhưng tôi nghĩ mã là cơ bản và đơn giản. Chương trình này dành cho một bài tập đại học, và được cho là có hàm 'isdigit()' trong đó. Đây là mãLỗi biên dịch GCC: định dạng '% c' dự đoán đối số của loại 'char *', nhưng đối số 2 có loại 'int' [-Wformat]

//by Nyxm 
#include <stdio.h> 
#include <ctype.h> 

main() 
{ 
    char userChar; 
    int userNum, randNum; 
    srand(clock()); 
    printf("\nThis program will generate a random number between 0 and 9 for a user to guess.\n"); 
    /*I changed it from '1 to 10' to '0 to 9' to be able to use the isdigit() function which 
    will only let me use a 1 digit character for an argument*/ 
    printf("Please enter a digit from 0 to 9 as your guess: "); 
    scanf("%c", userChar); 
    if (isdigit(userChar)) 
    { 
      userNum = userChar - '0'; 
      randNum = (rand() % 10); 
      if (userNum == randNum) 
      { 
        printf("Good guess! It was the random number.\n"); 
      } 
      else 
      { 
        printf("Sorry, the random number was %d.\n", randNum); 
      } 
    } 
    else 
    { 
      printf("Sorry, you did not enter a digit between 0 and 9. Please try to run the program again.\$ 
    } 
} 

Khi tôi cố gắng biên soạn, tôi nhận được lỗi sau

week3work1.c: In function ‘main’: 
week3work1.c:14:2: warning: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat] 

gì trên trái đất đang xảy ra? Tôi rất muốn được giúp đỡ. Bất kỳ trợ giúp nào cả. Tôi nghiêm túc về việc từ bỏ chương trình này. Tại sao nó nói nó mong đợi đối số của 'char *' khi sách giáo khoa của tôi cho thấy rằng "% c" là dành cho ole 'char' thông thường? Tôi đang sử dụng nano, gcc và Ubuntu nếu điều đó tạo ra bất kỳ sự khác biệt nào.

+2

'gcc' tạo nhiều cảnh báo cho chương trình của bạn. Bạn nên sửa * tất cả * của chúng. Ví dụ: bạn đang thiếu '#include ' (bắt buộc đối với 'srand()' và 'rand()') và '#include ' (bắt buộc đối với 'clock()'). –

+0

@KeithThompson Khi biên dịch, tôi không còn lỗi nữa, và chương trình hiện hoạt động như tôi muốn. Vì vậy, tôi đoán tôi đang yêu cầu nếu nó sẽ tiếp tục làm việc? Bởi vì trong sách giáo khoa của tôi, câu lệnh tiền xử lý duy nhất cần là '#include ' và '#include ' là dành cho hàm isdigit(). – Nyxm

+0

Bạn cần tiêu đề tôi đã mô tả ở trên nếu bạn định gọi các chức năng đó. Có những trường hợp mà bạn có thể thoát ra mà không sử dụng chúng, nhưng tôi sẽ không đi vào chi tiết; chỉ cần thêm các chỉ thị '# include'. gcc sẽ cảnh báo về các hàm gọi nếu bạn sử dụng '-std = c99 -pedantic'. Bạn đang sử dụng sách giáo khoa nào? Nếu nó cho thấy một ví dụ gọi là 'rand()' mà không có '#include ' hoặc gọi 'clock()' mà không có '#include ', thì sách giáo khoa của bạn sai. –

Trả lời

11

Đối với scanf(), bạn cần chuyển con trỏ đến char, nếu không nó không có bất kỳ cách nào để lưu trữ ký tự, vì được nói char sẽ được chuyển thành giá trị. Vì vậy, bạn cần &userChar để thay thế.

Giả sử userChar0 trước cuộc gọi. Với mã hiện tại của bạn, bạn đang về cơ bản làm điều này (như xa như tiện ích đi):

scanf("%c", 0); 

Những gì bạn muốn là thế này:

scanf("%c", some-location-to-put-a-char); 

Đó là &userChar.

Các man trang cho scanf đề cập đến điều này:

c  Matches a sequence of characters whose length is specified by 
      the maximum field width (default 1); the next pointer must be a 
      pointer to char, and there must be enough room for all the char‐ 
      acters (no terminating null byte is added). The usual skip of 
      leading white space is suppressed. To skip white space first, 
      use an explicit space in the format. 
+0

Tốt đau buồn. Tôi không thể tin rằng tôi đã quên '&'. Người đàn ông tôi cảm thấy như một thằng ngốc. Sẽ bình luận lại trực tiếp với kết quả. – Nyxm

+0

Hoạt động hoàn hảo. Cảm ơn bạn rất nhiều. Tôi đã đấu tranh với chương trình này trong một vài ngày nay. Đầu tiên nó là char để chuyển đổi int, và bây giờ điều này. Một lần nữa, cảm ơn! – Nyxm

+0

+1 cách tuyệt vời để giải thích việc truyền đạt bằng giá trị với sự mở rộng thực tế của giá trị. –

1

thay thế scanf("%c", userChar); bằng scanf("%c", &userChar);.

0

Bạn cần phải vượt qua trong một con trỏ thay vì giá trị của char.

scanf("%c",&userChar); 
Các vấn đề liên quan