Как работает C ++ atoi?

Поэтому у меня есть следующий код:

void Start(int &year, string &mon, char &nyd)
{
    printf("%s", mon);
    int month= atoi(mon.c_str());
    printf("%i", month);
}

Когда входящий параметр «03» (первый printf показывает 03), я получил 0 за месяц.

Однако, если я добавлю эту строку

mon = "03";

Я получил 3, что верно, за месяц.

Зачем......????

EDIT: Я понял. Вы, ребята, были правы. НЕ используйте scanf для ввода строки.

3
nl ja de
Я просто не знаю, с чего начать.
добавлено автор Lightness Races in Orbit, источник
Вы не можете использовать std :: string с помощью % s .
добавлено автор chris, источник
С добавлением .data() или .c_str() . Еще лучше, придерживайтесь чего-то лучшего, чем atoi , например stoi , который на самом деле имеет проверку ошибок и более уместен для этой строки, std :: cout , который безопасен для печати.
добавлено автор chris, источник
добавлено автор Tieson T., источник
Итак, как вы предлагаете мне изменить код?
добавлено автор user1447343, источник
Тем не менее, результат функции atoi, который является месяцем, неверен ...
добавлено автор user1447343, источник

1 ответы

Вы не можете напечатать std :: string с помощью % s в функции printf, попробуйте следующее:

void Start(int &year, const std::string &mon, char &nyd)
{
    std::cout << mon << std::endl;
    int month= atoi(mon.c_str());
    std::cout << month << std::endl;
}

Или

void Start(int &year, string &mon, char &nyd)
{
    printf("%s\n", mon.c_str());
    int month= atoi(mon.c_str());
    printf("%i\n", month);
}

Но std :: cout предпочтительнее функции C printf.

Также не используйте scanf с std :: string, используйте std :: cin вместо scanf, std :: cout вместо printf.

3
добавлено
показать мне, как вы называете функцию Start?
добавлено автор billz, источник
используйте std :: cin вместо scanf, используйте std :: cout вместо printf ...
добавлено автор billz, источник
@ user1447343 Я не могу воспроизвести вашу ошибку. ideone.com/Y0Ftyo
добавлено автор Rapptz, источник
@ user1447343 Не использовать scanf с std :: string
добавлено автор Rapptz, источник
Да, но проблема не в printf; это об atoi. Я все равно получаю 0, когда mon = "03" после изменения функции printf.
добавлено автор user1447343, источник
printf («Месяц:»); scanf («% s», месяц); Начало (год, месяц, nyd);
добавлено автор user1447343, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest