Home > Enterprise >  Segmentation Fault when working with argv C
Segmentation Fault when working with argv C

Time:09-29

I have until now:

int main(int argc, char * argv[]) {

  std::vector<std::string> args;

  for (int i = 1; i < argc; i  ) {
      args.push_back({ argv[i] });
  }
  std::string dateString = args[1];

return 0;
}

and I get Segmentation Fault on line: std::string dateString = args[1];

What I want to do is to use something like: ./myalgorithm.cpp 2022-09-01 where 2022-09-01 is a date. Then, I want to get to this date via argv[1], save it to a std::string variable and then do some computation with each value from the date( 2022, 09 and 01).

I was thinking to save this date to a string and then with the use of string.substr(...) to save into int variables the numbers from the date:

int year = stoi(mystring.substr(0,4));
int month = stoi(mystring.substr(6,2));
int day = stoi(mystring.substr(9,2));

EDIT: I edited my code and it works:

int main(int argc, char * argv[]) {

  std::vector<std::string> args;
  for (int i = 1; i < argc; i  ) {
      args.push_back({ argv[i] });
  }

  for (auto dateString: args) {
      double year = stoi(dateString.substr(0,4));
      double month = stoi(dateString.substr(5,2));
      double day = stoi(dateString.substr(8,2));
      std::cout << year << std::endl;
      std::cout << month << std::endl;
      std::cout << day << std::endl;
  }

  return 0;
}

But I don't understand why do I need to write:

std::vector<std::string> args;
  for (int i = 1; i < argc; i  ) {
      args.push_back({ argv[i] });
  }

Instead of simply:

std::vector<std::string> args;
args.push_back({ argv[1] });

EDIT:

Corrected Code:

int main(int argc, char * argv[]) {

  std::vector<std::string> args;
  if (argc > 1){
    args.push_back({ argv[1] });
  }
  for (auto dateString: args) {
      int year = stoi(dateString.substr(0,4));
      int month = stoi(dateString.substr(5,2));
      int day = stoi(dateString.substr(8,2));
      int gpsweek = GPSweek(year, month, day);
      printf("%d\n", gpsweek);
  }
  return 0;
}

CodePudding user response:

When you use ./myalgorithm.cpp 2022-09-01, what are argc and argv?

argc is count of arguments program name.

argv is program name and these arguments.

So argc = 2 and argv = { myalgorithm.cpp, 2022-09-01 }

  std::vector<std::string> args;

  for (int i = 1; i < argc; i  ) {
      args.push_back({ argv[i] });
  }

After the code, the variable args is { "2022-09-01" } because you start from i = 1 but not 0.

C array (including std::vector) index starts from 0, so the first item has index being 0. If you try to take the second item with index = 1 then it is the array out of bounds. It is Undefined Behavior in C and Segmentation Fault is one of the outcomes.

Use args[0] to take the first item - "2022-09-01".

The range based for uses iterators which start from index = 0 for std::vector, therefore your correct code works.

  •  Tags:  
  • c
  • Related