16

if I include stdlib.h then also itoa() is not recognized. My code :

%{
#include "stdlib.h"
#include <stdio.h>
#include <math.h>
int yylex(void);
char p[10]="t",n1[10];
int n ='0';

%}
%union
{
char *dval;
}
%token ID
%left '+' '-'
%left '*' '/'
%nonassoc UMINUS
%type <dval> S
%type <dval> E
%%
S : ID '=' E {printf(" x = %sn",$$);}
;
E : ID {}
| E '+' E {n++;itoa(n,n1,10);printf(" %s = %s + %s ",p,$1,$3);strcpy($$,p);strcat($$,n1);}
| E '-' E {n++;itoa(n,n1,10);printf(" %s = %s – %s ",p,$1,$3);strcpy($$,p);strcat($$,n1);}
| E '*' E {n++;itoa(n,n1,10);printf(" %s = %s * %s ",p,$1,$3);strcpy($$,p);strcat($$,n1);}
| E '/' E {n++;itoa(n,n1,10);printf(" %s = %s / %s ",p,$1,$3);strcpy($$,p);strcat($$,n1);}
;
%%

main()
{
yyparse();
}

int yyerror (char *s)


{


}

After running the code I got :

gcc lex.yy.c y.tab.c -ll
12.y: In function ‘yyparse’:
12.y:24: warning: incompatible implicit declaration of built-in function ‘strcpy’
12.y:24: warning: incompatible implicit declaration of built-in function ‘strcat’
12.y:25: warning: incompatible implicit declaration of built-in function ‘strcpy’
12.y:25: warning: incompatible implicit declaration of built-in function ‘strcat’
12.y:26: warning: incompatible implicit declaration of built-in function ‘strcpy’
12.y:26: warning: incompatible implicit declaration of built-in function ‘strcat’
12.y:27: warning: incompatible implicit declaration of built-in function ‘strcpy’
12.y:27: warning: incompatible implicit declaration of built-in function ‘strcat’
/tmp/ccl0kjje.o: In function `yyparse':
y.tab.c:(.text+0x33d): undefined reference to `itoa'
y.tab.c:(.text+0x3bc): undefined reference to `itoa'
y.tab.c:(.text+0x43b): undefined reference to `itoa'
y.tab.c:(.text+0x4b7): undefined reference to `itoa'

Where am I going wrong ? Why cant it find the reference to itoa ? I have also tried with <> brackets for itoa.

user207421
  • 305,947
  • 44
  • 307
  • 483
Anubha
  • 1,345
  • 6
  • 23
  • 35
  • possible duplicate of [C Error: undefined reference to '\_itoa'](http://stackoverflow.com/questions/5428632/c-error-undefined-reference-to-itoa) – Sheena Oct 23 '13 at 12:01

2 Answers2

24

itoa is a non-standard function which is supported by some compilers. Going by the error, it's not supported by your compiler. Your best bet is to use snprintf() instead.

P.P
  • 117,907
  • 20
  • 175
  • 238
  • 1
    please could you tell how to use snprintf() ? – Anubha Oct 19 '12 at 08:47
  • 2
    An example use: `snprintf (buff, sizeof(buf), "%d",n); // print int 'n' into the char[] buffer` – P.P Oct 19 '12 at 08:52
  • yes I saw alternative to itoa at : http://stackoverflow.com/questions/228005/alternative-to-itoa-for-converting-integer-to-string-c – Anubha Oct 19 '12 at 08:56
  • It doesn't work when you have a char pointer and it already has some value. It crashes (Segmentation Fault: Address out of bound). – Shreyas Sep 08 '18 at 21:03
9

I use sprintf in following way:

#include <stdio.h>

char *my_itoa(int num, char *str)
{
        if(str == NULL)
        {
                return NULL;
        }
        sprintf(str, "%d", num);
        return str;
}

int main()
{
        int num = 2016;
        char str[20];
        if(my_itoa(num, str) != NULL)
        {
                printf("%s\n", str);
        }
}

I hope this will save someone's time ;)

Nitinkumar Ambekar
  • 969
  • 20
  • 39