Я хотел изменить общую программу getchar_unlocked, чтобы печатать позицию пробела при вводе второго числа. Итак, я ввел еще 2 переменные r и a, так что r увеличивается на единицу каждый раз, когда вводится непробельный символ, и получает значение r, когда вводится пробел Тем не менее, по изменению я сделал только первое нет. хранится в s, а значение мусора сохраняется в. Почему так?
#include <cstdio>
#define getcx getchar_unlocked
using namespace std;
inline void scan( int &n, int &a) //extra parameter a added
{
n=0; int r=0;
char ch;
ch=getcx();
while (ch<'0' || ch>'9') //Inclusion of a !=' ' condition
{
if (ch==' ')
a=r;
else
r++;
ch=getcx();
}
while (ch>='0' && ch<='9')
{
r++;
n=10*n + ch -'0';
ch=getcx();
}
}
int main()
{
int t,s,a;
scan(t,a);
printf("%d\n",t);
scan(s,a);
printf("%d",s);
printf("%d",a);
return 0;
}
scan
функция пропускает не-цифры, а затем читает 1 или более цифр как целое число в n
и, наконец, пропускает один нецифровый символ. В первом цикле для пропуска нецифровых чисел подсчитывается количество прочитанных не пробелов и сохраняется это число в a
всякий раз, когда он видит пространство. Если он никогда не видит пространство, a
останется неизменным.
Так что, если вы даете вашей программе такой вклад, как 10 20
(только с одним пробелом), этот пробел будет пропущен при первом вызове для сканирования (без цифры после номера), и a
никогда не будет инициализирован.
Если вы хотите, чтобы ваш scan
рутина к не пропустить символ после числа, которое он читает, вам нужно позвонить ungetc
положить его обратно после прочтения и обнаружения, что это не цифра.
Вы присваиваете значение r
указатель a
с a=r;
, должно быть *a=r;
и у вас есть похожие проблемы с n=10*n + ch -'0';
должно быть *n=10*(*n) + ch -'0';
, Никогда не забывайте свои аргументы функции ( int &n, int &a)
делать n
а также a
указатели и должны быть разыменованы для присвоения значений. Фактически, в исходном потоке я принял аргументы за псевдокод (int &n, int &а) В реальной реализации я бы сделал (int *n, int *a)
и измените код соответственно.
Вот как я обновил оригинал, это иллюстрирует реализацию передачи по ссылке:
#include <stdio.h>
#define getcx getchar_unlocked
/* input parser reads - sign, and any digits that follow */
inline void inp ( int *num )
{
int n = 0;
int sign = 1;
char ch = getcx();
/* get the sign */
while ( ch < '0' || ch > '9' )
{ if (ch == '-') sign = -1; ch = getcx();}
/* add each char read. n is accumulator, (n << 3) + (n << 1) is just n * 10 */
while ( ch >= '0' && ch <= '9' )
n = (n << 3) + (n << 1) + ch - '0', ch = getcx(); /* = n*10 + ch - 48 */
n = n * sign;
*num = n;
}
int main (void) {
int number = 0;
printf ("enter something containing nummbers\n");
inp (&number);
printf ("number: %d\n", number);
return 0;
}