2013-12-11 23 views
6

Tôi đang viết một chương trình C về Ký hiệu Đảo ngược Ba Lan, có các toán hạng và toán tử của nó thông qua các đối số dòng lệnh. Nhưng mọi thứ xảy ra sai khi toán tử nhân * xuất hiện, và tôi không biết tại sao.
Đây là chương trình nhỏ để gỡ lỗi.Số đối số dòng lệnh không chính xác khi chuyển `*`

test.c

int main(int argc, char **argv) 
{ 
    printf("%d\n", argc); 
    return 0; 
} 

// run case   result 
    ./test a b   3 
    ./test *    66 

Vậy tại sao các '*' lập luận làm cho một kết quả sai?

+2

'*' có ý nghĩa đặc biệt. – Maroun

+1

Shell mở rộng '*' cho tất cả các tệp hiển thị trong thư mục bạn chạy chương trình bạn có thể chỉ sử dụng 'x' làm toán tử nhân – hetepeperfan

Trả lời

11

* có hình cầu vỏ. Vì vậy, nó sẽ mở rộng cho tất cả các tập tin trong thư mục hiện tại của bạn, đó sẽ là các đối số cho chương trình của bạn, bạn có 65 tập tin trong thư mục của bạn. Bạn có thể xem những gì đang xảy ra nếu bạn chạy echo *

Bạn cần phải trích dẫn duy nhất * như trong ./test '*' (dấu ngoặc kép sẽ làm việc quá), điều này sẽ ngăn chặn sự mở rộng vỏ *. Một * được trao cho chương trình của bạn trong trường hợp này, trình bao sẽ loại bỏ các dấu nháy đơn.

Nếu bạn muốn đánh giá biểu thức, bạn có thể làm

./test 3 2 '*' 

Trong trường hợp này chương trình của bạn nhận được 3 đối số bổ sung tách ra để argv[1]3, argv[2]2argv[3]*

Hoặc bạn có thể làm:

./test '3 2 *' 

Trong trường hợp này, chương trình của bạn nhận được 1 đối số bổ sung, argv[1] sẽ là chuỗi 3 2 *

+0

@Bathsheba, chính xác! – Bin

+0

Có nghĩa là tôi phải phân tích cú pháp '*' thành *, -_- – Bin

+3

Không, bạn không phải phân tích cú pháp ''*'' thành '*'. Đó là shell thay đổi '*' thành một danh sách các tệp trong thư mục hiện tại và ''*'' (hoặc '" * "') thành chỉ '*'. Vì vậy, cho chương trình của bạn ''*'' từ trình bao sẽ cung cấp cho chương trình của bạn chỉ một đối số có chứa '*' không có dấu ngoặc kép. – Shahbaz

8

Vỏ lệnh của bạn đang xử lý * dưới dạng ký tự đại diện. Nó có thể bao gồm tất cả các tập tin trong thư mục hiện tại: 60 trong trường hợp của bạn.

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