Question: Say that I have this part of code. If user does not enter the file names as command line arguments I want to ask him again so as to enter them now but as it seems I cannot have access in argv[1] and argv[2]. For example when the first scanf is executed segmentation fault occurs. But in this case how can I read the arguments and place them into argv[1] and argv[2]?
Thanks in advance for your help!

```
int main (int argc, char **argv)
{
    if (argc != 3)
    {
        printf("You did not enter two files.\n");
        printf("You can now enter those two files.\n");
        printf("file 1: ");
        scanf("%s", argv[1]);
        printf("file 2: ");
        scanf("%s ", argv[2]);
    }

    printf("%s\n", argv[1]);
    printf("%s\n", argv[2]);

    FILE *file1 = fopen(argv[1], "r");
    FILE *file2 = fopen(argv[2], "r");
}

```

Answer: 
A segmentation fault occurs because length of the argv array is determined when the user runs the program. If you run a program like this:

```
./programName

```

argv is only 1 element long. It's impossible to access argv[1] or argv[2] after that. Still, You can get the necessary data and save them in regular variables.
Note that `argv[1]` and `argv[2]` are only valid if `argc >= 3`.
Thus accessing them is of course wrong.

Then if you want to read the arguments from stdin, you must make sure that you have memory where those strings are kept.
You might use something like

```
char filename1[20], filename2[20];
char *f1, *f2;
if (argc == 3) {
  f1 = argv[1];
  f2 = argv[2];
} else {
  f1 = filename1;
  f2 = filename2;
  /* add code to read into filename1 and filename2 */
}
/* use f1 and f2 */

```

You can see that I only reserved 20 bytes for each filename, which was arbitrary chosen by me.
It is critical here to not write more than 20 bytes into those arrays (including the terminating NUL char), so you should not use scanf like this.

You can see that this is not really straight-forward in C so there is also not an answer that suites all purposes.

Edit: also be sure to never write into any `argc[...]` memory, as it is supplied from the system. Although not marked `const` I would rather consider it as such.