warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast

StackOverflow https://stackoverflow.com/questions/19766996

  •  03-07-2022
  •  | 
  •  

Question

I am using ANSI C and getting "warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast" for my below code:

#define MAX_LINE_SIZE 1024
#define DELIMITER ","
#define TICKET_NAME_LEN 40
#define TICKET_ZONE_LEN 10

struct stock_data 
{
    char ticket_name[TICKET_NAME_LEN+1];
    char ticket_type;
    char ticket_zone[TICKET_ZONE_LEN+1];
    unsigned int ticket_price;
    unsigned int stock_level;
};

typedef struct stock_node 
{
    struct stock_data * data;
    struct stock_node * next_node;
} stock_node;

char temp_line[MAX_LINE_SIZE];
char *token;
int i, count = 0;

stock_node * snode = NULL;
struct stock_data * sdata = NULL;

FILE *stock_file = fopen( stockfile, "r" );

while (fgets(temp_line, MAX_LINE_SIZE, stock_file) != NULL) {

  token = strtok (temp_line, DELIMITER);
  count++;

  snode = (stock_node *) malloc(count * sizeof(stock_node));
  if (snode == NULL) { abort(); }  

  snode->data = (struct stock_data *) malloc(sizeof(struct stock_data));
  if (snode->data == NULL) { abort(); }  

  i = 1;

  while(token != NULL) {
     switch(i) {
        case 1:
           strcpy(snode[count - 1].data->ticket_name, token);
           break;
        case 2:
           strcpy(snode[count - 1].data->ticket_type, token);
           break;
        case 3:
           strcpy(snode[count - 1].data->ticket_zone, token);
           break;
        case 4:
           strcpy(snode[count - 1].data->ticket_price, token);
           break;
        case 5:
           strcpy(snode[count - 1].data->stock_level, token);
           break;                                                            
     }
     token = strtok (NULL, DELIMITER);
     i++;
  }
}

I get the warning for lines:

strcpy(snode[count - 1].data->ticket_type, token); (as ticket_type is char)
strcpy(snode[count - 1].data->ticket_price, token); (as ticket_price is unsigned int)
strcpy(snode[count - 1].data->stock_level, token); (as stock_level is unsigned int)

I know why (sort of) however I don't know how to fix it :(


The solution was to change the switch so it reads:

 switch(i) {
    case 1:
       strcpy(snode[count - 1].data->ticket_name, token);
       break;
    case 2:
       snode[count - 1].data->ticket_type = token[0];
       break;
    case 3:
       strcpy(snode[count - 1].data->ticket_zone, token);
       break;
    case 4:
       snode[count - 1].data->ticket_price = atoi(token);
       break;
    case 5:
       snode[count - 1].data->stock_level = atoi(token);
       break;                                                            
 }
Was it helpful?

Solution

You should use strcpy() to copy source string into destination string.

if you want to copy string into integer value first you need to convert string into integer and then do direct assignment.

For example You can use atoi() or strtol() Functions.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top