c - Segmentation fault when trying to declare an array of strings -


in program, trying copy each argv[i] keyword[i], program fails segmentation fault. doing wrong?

#include <stdio.h> #include <cs50.h> #include <ctype.h> #include <string.h>  int main(int argc, string argv[])     {     //prototype     string keyword = "";     //int j;      (int = 0, n = strlen(argv[1]); < n; i++)     {         keyword[i] = toupper(argv[1][i]);         printf("%i-- printing letters\n", keyword[i]);     } } 

as others have observed, initialize variable keyword either empty string or pointer empty string literal, depending on definition of type string. either way, valid evaluate keyword[i] i equal zero; other value -- read or write -- out of bounds. furthermore, in latter (pointer string literal) case, must not attempt modify array keyword points to.

note in particular c not automatically expand strings if try access out of bounds element. instead, attempt produces "undefined behavior", , common way manifest in such cases in form of segmentation fault. can view segmentation fault system slapping down program attempting access memory not belong it.

since don't know a priori how long argument string before copy it, viable type keyword char *. use type instead of string in follows, clarity.

if indeed want make copy of argument, far easiest way via for-purpose function strdup():

    char *keyword = strdup(argv[1]); 

that allocates enough memory copy of argument, including terminator, copies it, , returns pointer result. obligated free resulting memory via free() function when you're done it. having made copy in way, can upcase each element in place:

    (int = 0, n = strlen(keyword); < n; i++)     {         keyword[i] = toupper(keyword[i]);         printf("%c-- printing letters\n", keyword[i]);     } 

note, way, printf() format descriptor single character %c, not %i. must use print characters as characters, rather integer values.

that's 1 of simplest ways write c code you're trying do, though there many variations. other 1 i'll offer consideration not copy argument @ all:

    char *keyword = argv[1]; 

if initialize keyword way not allocate memory or make copy; instead, set keyword point same string argv[1] points to. can modify string in-place (though cannot lengthen it), provided not need retain original contents.

before wrap up, should observe program not check whether there argument. in event there not (i.e. argc < 2), argv[1] either contains null pointer (argc == 1) or undefined (argc == 0; you're unlikely ever run this). either way, program produces undefined behavior in case if attempts use argv[1] if pointer valid string. should test case first off, , terminate diagnostic message if no program argument available.


Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -