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
Post a Comment