-1

I am trying to generate a name string by concatenating random vowels and consonants.

I've tried using strcat to concatenate random vowels/consonants to the name string, but that results in segmentation fault.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

[...]

char randomVowel() {
    char * vowels = "aeiou";
    return vowels[randomRange(0, 4)];
}

char randomConsonant() {
    char * consonants = "bcdfghjklmnpqrstvxwyz";
    return consonants[randomRange(0, 20)];
}


char * randomName() { 
    int i; 
    char * name;

    for (i = 0; i < randomNumber(20); i++){
        i % 2 ? strcat(name, randomVowel()) : strcat(name, randomConsonant());
    }

    return name;
}

int main () {

    printf("%s\n", randomName());

    return 0;
}

What is the best approach for this problem?

  • 2
    `char * name;` is an uninitialized pointer. Passing that as the first parameter of `strcat` invokes *undefined behavior*. The documentation clearly states it needs to be a null-terminated byte string: https://en.cppreference.com/w/c/string/byte/strcat – UnholySheep Apr 05 '19 at 21:04
  • 2
    also... `strcat` wants two strings, i.e. `char *`, but your functions `randomVowel` and `randomConsonant` both return `char` values. – bruceg Apr 05 '19 at 21:09
  • See this question in the C FAQ concerning [uninitialized pointers](https://stackoverflow.com/questions/37549594/crash-or-segmentation-fault-when-data-is-copied-scanned-read-to-an-uninitializ) – Mark Benningfield Apr 05 '19 at 21:23
  • also... even if you initialized `name` inside of `randomName` you can't return a pointer to local variable. – bruceg Apr 05 '19 at 21:24

1 Answers1

1

you probably need to do something like this:

void appendChar(char *name, int len, char c) {
    name[len] = c;
}

char * randomName(char *name) {
    int i;

    for (i = 0; i < randomNumber(20); i++){
        i % 2 ? appendChar(name, i, randomVowel()) : appendChar(name, i, randomConsonant());
    }

    return name;
}

int main () {
    char name[32] = "";
    time_t t;

    srand((unsigned) time(&t));

    printf("%s\n", randomName(name));

    return 0;
}

This way you are just putting each character your generate at the end of your name string. You usually want to seed your random number generator in your main function, so I put that there for you too.

bruceg
  • 2,433
  • 1
  • 22
  • 29