Я прочитал в geeksforgeeks и добавил к нему шаблон, чтобы он мог работать для всех целочисленных типов данных, таких как long, long long и int.
#include <bits/stdc++.h>
using namespace std;
template<typename T>
void fs(T& x) // For faster scanning of input
{
int n = 1;
char c = getchar();
x = 0;
for (; (c < 48 || c>57) && c != '-'; c = getchar());
if (c == '-') {
n = -1;
c = getchar();
}
for (; (c < 47 && c < 58); c = getchar())
x = (x << 1) + (x << 3) + c - 48;
x = n * x;
}
int main()
{
int test;
fs(test);
cout << test;
return 0;
}
Но когда я попытался выполнить его, вывод отображается как 0, а не вводимое число. Является ли приведенный выше код неправильным?
Обратите внимание, что <bits/stdc++.h> — это нет a стандартный заголовок С++ (просто уродливая деталь реализации). Так что не используйте его. Также прочитайте Как отлаживать небольшие программы
Пожалуйста, получите хорошая книга по С++ и начните читать, если вы хотите систематически изучать C++.





the output is shown as 0 and not the input number.
тест в
for (;(c<47 && c<58);c=getchar())
не правильный и должен быть
for (;(c>47 && c<58);c=getchar())
// ^
Из-за ошибки при вводе например 123 ни один из для ничего не делает и Икс остается равным 0.
После исправления, компиляции и выполнения (также добавление <<endl в cout):
pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra cc.cc
pi@raspberrypi:/tmp $ ./a.out
123
123
pi@raspberrypi:/tmp $ ./a.out
-123
-123
pi@raspberrypi:/tmp $
Из-за этого использовать коды нельзя ни для чтения, ни для переноса, лучше сделать
for(;(c<'0' || c>'9') && c!='-';c=getchar());
...
for (;(c>='0' && c<='9');c=getchar())
и эти для более читабельны, чем пока.
Как сообщил @Basile Starynkevitch, вы также можете использовать std:: isdigit, чтобы проверить, является ли с цифрой или нет, у вас не было бы ошибки при ее использовании.
Предупреждение, если вы достигаете EOF в первом для, код зацикливается без конца, более безопасно добавить в него && (c != EOF) и для этого ввести с с инт, а не уголь.
Я также призываю вас не использовать #include <bits/stdc++.h>, см. Почему я не должен #include <bits/stdc++.h>?
Оба одинаковы...
@Ник, что ты имеешь в виду? с c>47 код работает как положено
@nick Обратите внимание на переключение <-> в c>47
О, извините, спасибо .. глупые ошибки
!isdigit(c) лучше, чем c < '0' || c > '9'@BasileStarynkevitch Я хотел быть ближе к исходному коду, я отредактировал свой ответ, чтобы рассказать об этом, ведь ОП не допустил бы ошибки, используя его ;-)
c должен быть int.
@RetiredNinja, вы правы, я неправильно прочитал код и предположил, что это уже было, я редактирую свой ответ
Не связано: Что такое магическое число и почему оно плохое?