Tham số chính C


9

Tôi đã viết một mã phải hiển thị các tham số chính, nhưng khi tôi biên dịch nó và gõ vào chương trình "*" sẽ hiển thị cấu trúc tệp của tôi. Lệnh trong cmd trông như thế này:program.exe 1 2 3 *

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++) printf("%s\n", argv[i]);
    return 0;
}

Kết quả là:

program
1
2
3
program.c
program.exe
10-03-20
11-02-20

Và câu hỏi của tôi: Có thể buộc chương trình in "*" thay vì liệt kê các tệp. Cảm ơn lời khuyên


5
Các *được giải thích bởi shell, không phải chính chương trình. Sử dụng \*hoặc "*"để chuyển * cho chương trình.
mch

5
Vấn đề là *được chuyển đổi sang "file1 file2 ..."vỏ của bạn. Không có gì sai với chương trình C của bạn (mặc dù bao gồm <stdlib.h>là không cần thiết). Để ngăn vỏ chuyển đổi dấu sao, hãy sử dụng dấu ngoặc kép:program.exe 1 2 3 "*"
pmg

cảm ơn vì sự giúp đỡ
stasio14

Không liên quan đến câu hỏi, nhưng nói đúng ra char const* argv[]là không đúng. Bạn không thể tự phát minh ra các dạng main (), chỉ trình biên dịch mới có thể làm điều đó. argvthực sự là đọc / ghi bộ nhớ, mặc dù viết cho nó thường không phải là ý tưởng tốt nhất.
Lundin

1
Shell cmd Windows không thực hiện mở rộng ký tự đại diện. Hoặc nó không được chạy từ shell cmd, hoặc trình biên dịch đang chèn logic để mô phỏng sự mở rộng mà shell sẽ làm
ikegami

Câu trả lời:


5

mingw làm cho chương trình thực hiện mở rộng ký tự đại diện của các tham số. Thêm phần sau vào chương trình của bạn để vô hiệu hóa hành vi này:

int _CRT_glob = 0;

Trong thế giới unix, shell dự kiến ​​sẽ thực hiện mở rộng ký tự đại diện.

$ perl -le'print for @ARGV' *
a
b

Trong thế giới Windows, mở rộng ký tự đại diện được để lại cho ứng dụng.

>perl -le"print for @ARGV" *
*

Điều đó làm cho việc viết chương trình di động trở nên khó khăn. Vì mingw thường được sử dụng để biên dịch các chương trình không được ghi bằng Windows, thư viện thời gian chạy C của nó tự động mở rộng các tham số ký tự đại diện.

a.c:

#include <stdio.h>

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++)
        printf("%s\n", argv[i]);

    return 0;
}
>gcc -Wall -Wextra -pedantic-errors a.c -o a.exe & a *
a
a.c
a.exe

Nhưng, mingw cung cấp một ra. Thêm phần sau vào chương trình của bạn sẽ vô hiệu hóa hành vi này:

int _CRT_glob = 0; 

a.c:

#include <stdio.h>

int _CRT_glob = 0; 

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++)
        printf("%s\n", argv[i]);

    return 0;
}
>gcc -Wall -Wextra -pedantic-errors a.c -o a.exe & a *
a
*
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.