Редактировать: Я мог поклясться, что пост был помечен C ++ в начале. Я оставлю это на тот случай, если OP заинтересован в ответах на C ++ и изменение тега C было изменено.
Еще одна опция, которая может быть расширена с учетом вопроса, - это использовать boost :: lexical_cast следующим образом:
scanf("%s", str );
printf("str: %s\n", str);
int i = boost::lexical_cast<int>( str );
Я много использовал boost :: lexical_cast для преобразования между типами, главным образом, в строки и примитивы при чтении в пользовательских свойствах. Я считаю это бесценным ресурсом.
Стоит отметить, что boost :: lexical_cast может генерировать исключения, и они должны быть соответствующим образом обработаны при использовании вызова. Ссылка, которую я разместил в начале этого ответа, содержит всю необходимую для этого информацию.