views:

735

answers:

3

hi all, my problem is in convert a char to string i have to pass to strcat() a char to append to a string, how can i do? thanks!

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

char *asd(char* in, char *out){
    while(*in){
        strcat(out, *in); // <-- err arg 2 makes pointer from integer without a cast
        *in++;
    }
    return out;
}

int main(){
    char st[] = "text";
    char ok[200];
    asd(st, ok);
    printf("%s", ok);
    return 0;
}
+4  A: 

Since ok is pointing to an uninitialized array of characters, it'll all be garbage values, so where the concatenation (by strcat) will start is unknown. Also strcat takes a C-string (i.e. an array of characters which is terminated by a '\0' character). Giving char a[200] = "" will give you a[0] = '\0', then a[1] to a[199] set to 0.

Edit: (added the corrected version of the code)

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

char *asd(char* in, char *out)
{

/*
    It is incorrect to pass `*in` since it'll give only the character pointed to 
    by `in`; passing `in` will give the starting address of the array to strcat
 */

    strcat(out, in);
    return out;
}

int main(){
    char st[] = "text";
    char ok[200] = "somevalue"; /* 's', 'o', 'm', 'e', 'v', 'a', 'l', 'u', 'e', '\0' */
    asd(st, ok);
    printf("%s", ok);
    return 0;
}
legends2k
+3  A: 

strcat will not append single characters. Instead it takes a const char* (a full C-style string) which is appended to the string in the first parameter. So your function should read something like:

char *asd(char* in, char *out)
{
    char *end = out + strlen(out);

    do
    {
        *end++ = *in;

    } while(*in++);

    return out;
}

The do-while loop will include the zero-terminator which is necessary at the end of C-style strings. Make sure that your out string is initialized with a zero-terminator at the end or this example will fail.

And as an aside: Think about what *in++; does. It will increment in and dereference it, which is the very same as in++, so the * is useless.

AndiDog
+1  A: 

To look at your code, I can make a couple of pointers in relation to it, this is not a criticism, take this with a pinch of salt that will enable you to be a better C programmer:

  • No function prototype.
  • Incorrect usage of pointers
  • Dealing with the strcat function is used incorrectly.
  • Overdoing it - no need for the asd function itself!
  • Usage of dealing with variables notably char array that is not properly initialized.
#include <stdio.h>
#include <string.h>

int main(){
    char st[] = "text";
    char ok[200];
    ok[0] = '\0'; /* OR
    memset(ok, 0, sizeof(ok));
    */
    strcat(ok, st);
    printf("%s", ok);
    return 0;
}

Hope this helps, Best regards, Tom.

tommieb75
Using the "asd" function allows for asd to be used in other contexts, allowing for main to ignore the computation behind asd itself.I'd always opt for a function, whatever the case might be.
Mustapha Isyaku-Rabiu
Also, your memset() is completely irrelevant, simply declare it as so: char ok[200] = { 0 };
Mustapha Isyaku-Rabiu
@rogue: You can do it that way if you want, no explicit means, either your way or the way I have mentioned, notice the comment marker OR and the memset...either way depends on your style!
tommieb75
Right guys, or you can do `ok[200] = "";` all-in-one statement. It's all a matter of style.
legends2k
thanks guys I appreciate your praise because I always try to understand how a programmer works because where I study, understanding is given all to the books and thanks to comments I can understand the most important part of the planning and everything you say I stock. However the example I did, I wrote the code only to give an example of my question, of course, to create a program I would never create and use a function like this ;)
frx08
@legends2k: Don't you mean `char ok[200] = "";`? You won't be able to do that assignment anywhere other than the declaration of ok.
tomlogic
@tomlogic: Of course, I meant declaration + initialization; that's why in that comment I had written "all-in-one".
legends2k