doing the no-vowels cs50 problem and ran into an error with strcat

187 Views Asked by At

When running my program:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    string word = get_string("Give me a word: " );
    int j = strlen(word);
    int i;
    char new[j + 1];

    new[0] = '\0';
    
    for (i = 0; i < j; i++)
    {
        if (word[i] == 'e')
        {
            strcat(new, "3");
        }
        else if (word[i] == 'i')
        {
            strcat(new, "1");
        }
        else if (word[i] == 'a')
        {
            strcat(new, "6");
        }
        else if (word[i] == 'o')
        {
            strcat(new, "0");
        }
        else
        {
            char p = word[i];
            strcat(new, p);
        }
    }
    printf("%s\n", new);
}

I get the error:

no-vowels-test.c:39:25: error: incompatible integer to pointer conversion passing 'char' to parameter of type 'const char *'; take the address with & [-Werror,-Wint-conversion]
            strcat(new, word[i]);
                        ^~~~~~~
                        &
/usr/include/string.h:149:70: note: passing argument to parameter '__src' here
extern char *strcat (char *__restrict __dest, const char *__restrict __src)

My goal here is to make the last else statement append the current letter in the array of word[i] into the variable new[] to spell out a new word where every vowel is replaced by a number, the numbers I have no problem with. But the last else statement seems to have a problem and I cant figure out why.

2

There are 2 best solutions below

3
chqrlie On BEST ANSWER

The second argument to strcat must be a C string, ie: an array of char terminated with a null byte, not a single char such as p.

You can fix this problem with strncat: replace strcat(new, p); and the previous line with:

    strncat(new, &word[i], 1);

This concatenates at most 1 char from the string starting at word[i].

Another approach would set the bytes in new directly:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    string word = get_string("Give me a word: " );
    int i;
    int j = strlen(word);
    char new[j + 1];

    for (i = 0; i < j; i++)
    {
        if (word[i] == 'e')
        {
            new[i] = '3';
        }
        else if (word[i] == 'i')
        {
            new[i] = '1';
        }
        else if (word[i] == 'a')
        {
            new[i] = '6';
        }
        else if (word[i] == 'o')
        {
            new[i] = '0';
        }
        else
        {
            new[i] = word[i];
        }
    }
    new[i] = '\0';
    printf("%s\n", new);
}
2
ikegami On

To use strcat, you would need to provide a pointer to a NUL-terminated string.

char s[ 2 ] = { word[ i ], 0 };
strcat( new, s );

But you don't need strcat to add a single character. Especially since you already know the position at which to write the character. All you need is new[ i ] = c;. Just don't forget to terminate your string with a NUL once you're done.