Может кто-нибудь объяснить этот вывод с небольшим изменением в обычной функции getchar_unlocked ()?

Я хотел изменить общую программу 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;
}

-1

Решение

scan функция пропускает не-цифры, а затем читает 1 или более цифр как целое число в nи, наконец, пропускает один нецифровый символ. В первом цикле для пропуска нецифровых чисел подсчитывается количество прочитанных не пробелов и сохраняется это число в a всякий раз, когда он видит пространство. Если он никогда не видит пространство, a останется неизменным.

Так что, если вы даете вашей программе такой вклад, как 10 20 (только с одним пробелом), этот пробел будет пропущен при первом вызове для сканирования (без цифры после номера), и a никогда не будет инициализирован.

Если вы хотите, чтобы ваш scan рутина к не пропустить символ после числа, которое он читает, вам нужно позвонить ungetc положить его обратно после прочтения и обнаружения, что это не цифра.

0

Другие решения

Вы присваиваете значение 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;

}
0