C ошибка программы: предупреждение: неявное объявление функции «itoa»

#c

Вопрос:

Почему я получаю warning: implicit declaration of function 'itoa' ошибку? Я проверил заголовочные файлы и код. stdlib.h уже добавлен в директивы. Я совершенно не понимаю, почему продолжает появляться предупреждение/ошибка.

Мне нужно изменить заданную дату СИМВОЛА в формате ММ/ГГ на ЧИСЛО ГГГГММДД. Я использовал функцию, которая принимает переменную MM/YY в качестве параметра и разбивает ее на отдельные переменные, а затем объединяет их в одну переменную.

 #includelt;stdio.hgt; #includelt;string.hgt; #includelt;stdlib.hgt;  int getNumDate (char *date);    int main() {  char prodDate[5   1];  strcpy(prodDate,"03/12");    printf("%d", getNumDate(prodDate));    return 0; }   int getNumDate (char *date) {  static char orig_mmyy[5   1];  static char *str_ptr;  static char *c_yy = NULL;  static char *c_mm = NULL;  static char *c_dd = NULL;  char new_yy[4   1];  char new_mm[2   1];  char new_dd[2   1];  strcpy(new_dd, "01");  char finalDate_chars[8   1];  int finalDate;    strcpy(orig_mmyy, date);//store original MM/YY  str_ptr = orig_mmyy;//copy MM/YY to str_ptr  c_mm = strtok(str_ptr, "/");//store MM  c_yy = strtok(NULL, "/");//store YY  c_dd = "01";//set DD  if( atoi(c_yy) lt; 65 )//1965 is the Go Date -- less than 65 must be 21st Century  {   //****ERROR OCCURS HERE****//  itoa(atoi(c_yy)   2000, new_yy, 10);//convert YY to YYYY and copy to new YYYY  }  else  {  itoa(atoi(c_yy)   1900, new_yy, 10);//convert YY to YYYY for 20th Century (1900s)  }  memcpy(new_mm, c_mm, sizeof(new_mm));//copy new MM  memcpy(new_dd, c_dd, sizeof(new_dd));//copy new DD    strcat(finalDate_chars,new_yy);  strcat(finalDate_chars,new_mm);  strcat(finalDate_chars,new_dd);  finalDate = atoi(finalDate_chars);    return finalDate; }   

Комментарии:

1. itoa() не является стандартной функцией C, поэтому может отсутствовать в библиотеке вашей реализации.

Ответ №1:

В itoa стандарте C. нет функции, которую вы можете использовать snprintf вместо этого.

Кроме того, atoi доступен в стандарте C, но использовать его не рекомендуется, поскольку он не позволяет надежно обнаруживать ошибки. strtol вместо этого рекомендуется.

Комментарии:

1. Как snprintf может преобразовать число обратно в строку?

2. @JaguarNation: Эти функции хорошо документированы, и вы можете найти примеры по всему Интернету. (Поскольку snprintf вы можете найти больше примеров с sprintf , которые похожи, но менее безопасны, потому что это затрудняет предотвращение переполнения буфера; эти примеры было бы легко адаптировать.) Если у вас возникнут конкретные вопросы при чтении документации или примеров, пожалуйста, найдите здесь, чтобы узнать, даны ли на них ответы, а если нет, задайте их в качестве нового вопроса (а не в качестве комментариев к этому сообщению).

3. Хорошие моменты о том, что включено в стандарт C. Я думаю, что sscanf хорош для преобразования строк в int, а sprintf будет работать для преобразования int в строку. Спасибо.

4. Да, sscanf также может использоваться вместо strtol . Если вы используете sprintf вместо snprintf этого, вы должны быть очень осторожны, чтобы убедиться, что ваш буфер достаточно велик для максимально длительного вывода, и может быть трудно определить, насколько это может быть долго. Вот почему я не рекомендую этого делать.

5. @JaguarNation: Одна из проблем sscanf заключается в том, что если строка содержит цифры, которые образуют действительное число, но это число слишком велико для int (или любого другого указанного вами типа), то стандарт C говорит, что поведение неопределенно, что было бы очень плохо. Большинство реальных реализаций будут вести себя разумно в таком случае, но это затрудняет правильную обработку ошибок.