#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 говорит, что поведение неопределенно, что было бы очень плохо. Большинство реальных реализаций будут вести себя разумно в таком случае, но это затрудняет правильную обработку ошибок.