Как сдвинуть указатель на следующую ячейку в массиве? - C (СИ)
Формулировка задачи:
Есть массив в main, есть функция, в функцию передаётся указатель на начало массива, функция делает вычисления, после должна перевести указатель на следующую ячейку массива. Такая схема не работает:
*string++;
char f_createstring(char *string)
{
// флаги для проверки ввода
int it_is_firstsymbol = 1; //показывает что вводим первый символ (1 - первый символ, 0 - не первый)
int it_is_operation = 0; //показывает что ввели операцию (0 - не ввели, 1 - ввели)
int it_is_division = 0; //показывает что у нас сейчас обрабатывается операция деления (0 - всё кроме деления, 1 - деление)
//переменные
int ch; //переменная = полученный символ с клавиатуры
int symb_num = 0; //счётчик для защиты от переполнения
//char string[MAXOPERATOR]; //
while ((ch = getch())!='\r')
{
if (symb_num == MAXOPERATOR ) //защита от переполнения буффера
{
printf ("\n\nToo long example! One more again.\n");
//string[0]='\0';//обнулили массив, поставили точку в самом начале
return 0; //вышли из программы
}
if (ch >= '0' && ch <= '9')
{
if (it_is_division) //да у нас предыдущим было деление
{
if (ch == '0') //видим что делим на 0
break; //идём лесом
else
{
putchar(ch);
*string = ch;
}
}
else
{
putchar(ch);
*string = ch;
}
}
if (ch == '+'||ch == '-'||ch == '*')
{
if (it_is_firstsymbol) //нельзя вводить первым символом знак операции
break;
if (!(it_is_operation)) //нельзя вводить две операции подряд
{
putchar(ch);
*string = ch;
}
it_is_operation = !(it_is_operation);
}
if (ch == '/')
{
it_is_division == 1;
*string = ch;
}
/*if (ch == '\b') // для того, чтобы стирать
{
printf ("\b \b");
fflush(stdout); //если стирать то всё, беда, нужно зачищать этой функцией
if (--symb_num < 0)
symb_num = 0;
continue;
}*/
it_is_firstsymbol = 0;//у нас получено число, можно переключить флаг первого числа
string++;//взяли следующую ячейку строки
symb_num++;
}
if (ch == '\r')
{
*string = *(string+1); //взяли следующую ячейку строки, чтобы не испортить данные
*string = '\0'; //поставили в ней точку
return 1;
}
}int main ()
{
// перменные
// счётчики
int num_mistake = 5; //счётчик - у пользователя есть пять попыток не переполнить отведённую планку строки
int position = 0; //счётчик - позиция в строке
//массивы
char string[MAXOPERATOR]; //строка1 - первоначальная запись выражения
// ввод данных
while(1)
{
printf ("Enter example:");
// вызов функции формирования строки1
if (f_createstring(string))
break;
else if (!(--num_mistake))
{
printf ("You have exceeded the number of attempts.. programm is stoped");
return 0;
}
}
// вывод выражения
printf ("\nExample is: %s\n",string);
getch();
return 0;
}Решение задачи: «Как сдвинуть указатель на следующую ячейку в массиве?»
textual
Листинг программы
string++;
Объяснение кода листинга программы
- Переменная
stringсодержит указатель на текущую ячейку в массиве. - Увеличение значения переменной
stringна 1 сдвигает указатель на следующую ячейку в массиве. - Значение переменной
stringтеперь указывает на новую ячейку в массиве.