`int main(int argc, char ** argv)` có ý nghĩa gì?

Em có copy một bài của một bạn
nào đó nhưng đến câu lênh này em không hiểu ai giuos em với ạ
int main(int argc, char ** argv)
Thank các a trước

1 Like

Hàm main cũng như các hàm khác có nghĩa là đều nhận đối số để xử lí. Tuy nhiên tham số trong hàm main đã dc C định nghĩa sẵn, và có thứ tự :

  1. int agrc: đối số cho biết tham số đã nhập, kể cả tên chương trình.

  2. char *argv[] hoặc char **argv: mảng các pointer trỏ đến các chuỗi là tham số đi theo sau tên chương trình khi chạy chương trình từ DOS. Chuỗi là tên chương trình luôn được chỉ bởi argv[0].

Nếu bạn ko muốn dùng thì khai báo int main() cũng được.

4 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

Đoạn mã trên là một hàm trong ngôn ngữ lập trình C hoặc C++. Đây là hàm main , và đây thường là điểm bắt đầu của chương trình. Hàm main là nơi mà chương trình của bạn bắt đầu được thực thi khi bạn chạy chương trình.

Giờ hãy xem các tham số của hàm main :

  1. int argc : Đây là số lượng các tham số được truyền vào chương trình khi nó được chạy. argc viết tắt của “argument count” (số lượng tham số). Nó là một số nguyên (integer) và luôn luôn ít nhất bằng 1, vì chương trình luôn tính là một tham số (tên chương trình).
  2. char **argv : Đây là một mảng chứa các chuỗi (mảng ký tự) đại diện cho các tham số được truyền vào chương trình. argv viết tắt của “argument vector” (vector tham số). Điều quan trọng cần lưu ý là argv là một mảng hai chiều (một mảng các con trỏ đến mảng ký tự). Mỗi phần tử trong mảng argv là một con trỏ đến một chuỗi (cũng là một mảng ký tự).

Ví dụ: Nếu bạn chạy chương trình bằng cách nhập lệnh ./my_program arg1 arg2 , thì argc sẽ bằng 3 (bởi vì có 3 tham số, bao gồm tên chương trình) và argv sẽ là một mảng chứa 3 con trỏ, mỗi con trỏ trỏ đến một chuỗi tương ứng: argv[0] trỏ đến chuỗi "./my_program" , argv[1] trỏ đến chuỗi "arg1" , và argv[2] trỏ đến chuỗi "arg2" .

Ví dụ mã đơn giản cho hàm main có thể là:

cCopy code

#include <stdio.h>

int main(int argc, char **argv) {
    printf("Số lượng tham số: %d\n", argc);
    
    for (int i = 0; i < argc; ++i) {
        printf("Tham số %d: %s\n", i, argv[i]);
    }
    
    return 0;
}

Khi bạn chạy chương trình trên với lệnh ./my_program arg1 arg2 , đầu ra sẽ là:

yamlCopy code

Số lượng tham số: 3
Tham số 0: ./my_program
Tham số 1: arg1
Tham số 2: arg2

Hy vọng giải thích này sẽ giúp bạn hiểu rõ hơn về hàm main và các tham số của nó trong ngôn ngữ lập trình C/C++.

Nói dễ hiểu nó như này, ví dụ như mình có chương trình nén file zip trên Linux chẳng hạn. Thì khi bạn nén file đó bạn phải gõ lệnh như này.

zip main.zip main.cpp

thì main.zip vs main.cpp là arguments. Trong C++ để dùng đc arguments này thì bạn cần khai báo hàm main với kiểu

int main(int argc, char* argv[]) hay int main(int argc, char** argv) -> Cả 2 đều đúng.

Với argc là arguments count, nghĩa là đếm xem bao nhiều đối số truyền vào, ví dụ cái zip kia là 2, nhưng thực tế sẽ là 3, vì mặc định sẽ luôn có một đối số nữa là tên của ctr khi bạn chạy.

Để lấy được dữ liệu đối số đó thì bạn sẽ cần đến argv kia, thực chất nó chỉ là một array có kiểu là char* thôi. Mình sẽ vd một đoạn chương trình tính tổng như này cho dễ hiểu.

#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
  // Kiem tra doi so truyen vao, de tinh tong can 2 so a, b
  int first{}, second{};
  if(argc == 3) {
    // argv[0] se la ten cua chuong trinh
    first  = std::stoi(argv[1]) // lay so thu 1
    second = std::stoi(argv[2]) // lay so thu 2
  } else {
    return -1;
  }
  std::cout << "Tong la: " << first + second << '\n';
  return 0;
}

Bạn build bằng g++ main.cpp rồi chạy a.out 12 12 nó sẽ kq 24, 12 12 là đối số của 2 số cần tính thôi.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?