C: изменить символ в строке

Хотя это основной вопрос, точная ситуация отличается от средней. У меня есть char board[] = {"13572"}, представляющий доску (индекс массива — это строка доски, а int (представленный как char) — это количество элементов в этой строке. Если пользователь вводит «3 3» означает, что они хотят изменить количество элементов в индексе 2 на 2 (или, как видит пользователь, изменить количество элементов в строке 3 на 2, также пользователь считает, что индекс от 1 до 4 для Y и 1-7 для X), изменение платы на {"13272"}. У меня возникла проблема, когда ввод может изменить значение в выбранной строке на «/» или «0» вместо желаемого значения. Любой совет приветствуется, соответствующие функции приведены ниже:

Кроме того, board является глобальной переменной. Изменяет символы в массиве на целые (одиночные цифры):

int bd2int (char board[], int index){
    char buff[2] = {board[index],'\0'};
    return atoi(buff);
}

изменяет доску на основе перемещения (char move[3] в формате «X Y»): я считаю, что проблема здесь, при печати доски в виде строки, если индекс 2 был изменен, доска будет печатать только до индекса 1, указывая, что '\0' был вставлен в индекс 2.

int update(char move[]){
   int x;
   int y;
   x = bd2int(move,0);
   y = bd2int(move,2);
   x--;
   board[y-1] = (char)x;
   totalElements=    bd2int(board,0)+bd2int(board,1)+bd2int(board,2)+bd2int(board,3);
   return 1;
}

person CSjunkie    schedule 30.03.2015    source источник
comment
Непонятно, о чем вы спрашиваете, но если у вас есть char board[] = "13572"; и вы хотите изменить 5 на 2, то board[2] = '2'; (обратите внимание на кавычки для символьного значения '2' (decimal 50), а не десятичного числа 2.   -  person David C. Rankin    schedule 30.03.2015
comment
Я не уверен, что это имеет прямое отношение, но обратите внимание, что "X Y" требует char move[4]; (или больше) для хранения завершающего нулевого байта. Создайте MCVE (минимальный, полный, проверяемый пример), который воспроизводит проблему и не требует ввода данных пользователем.   -  person Jonathan Leffler    schedule 30.03.2015
comment
@DavidC.Rankin, проблема, с которой я столкнулся, заключается в том, что желаемый индекс иногда меняется на «\ 0» вместо того, что вводит пользователь. Из-за правил перемещения (о которых я не упомянул) значение x от пользователя должно быть уменьшено на 1 перед заменой текущего значения на доске, я считаю, что способ, которым я это обрабатываю, приводит к появлению «\ 0» вместо правильного результата.   -  person CSjunkie    schedule 30.03.2015
comment
@JonathanLeffler спасибо, я попробую   -  person CSjunkie    schedule 30.03.2015
comment
Почему вы сохраняете позиции на доске как char, а не как массив коротких целых чисел? Вам нужны эти 8 бит?   -  person Schwern    schedule 30.03.2015
comment
@Schwern Меня не беспокоит производительность, и показанные функции находятся на сервере, который отправляет плату массива символов клиентам на разных машинах, и они интерпретируют доску для отображения. Я считаю, что символы легче использовать для межпроцессного взаимодействия, чем шорты.   -  person CSjunkie    schedule 30.03.2015
comment
@CSjunkie Если ваш индекс меняется на '\0', то пользователь, вероятно, что-то делает (например, просто нажимает клавишу [Enter]), что приводит к неправильному вводу. Нам нужен MCVE, как просил Джохатан.   -  person David C. Rankin    schedule 30.03.2015
comment
@DavidC.Rankin Я работаю над MCVE, но мне гарантировано, что пользователь не введет недопустимый ход, поскольку запрос на перемещение будет отклонять недопустимые перемещения и запрашивать новый перед отправкой в ​​эти функции. Разрешены только ходы 0‹Y‹5 и 0‹X‹board[Y] в формате X Y   -  person CSjunkie    schedule 30.03.2015
comment
@JonathanLeffler в его нынешнем виде, любое перемещение приводит к изменению значения в индексе Y-1 на '\ 0'   -  person CSjunkie    schedule 30.03.2015
comment
Строка board[y-1] = (char)x; кажется проблематичной, поскольку вы ожидаете, что x будет иметь значение, скажем, 2 (как целое число), но как символ, представляющий символ STX (начало текста), а не символ '2'. Вы можете рассмотреть возможность использования sprint(), чтобы вернуть ему правильное значение символа.   -  person akivajgordon    schedule 30.03.2015
comment
@ akivag29 ты имеешь в виду sprintf()? Я считаю, что это требует использования указателей, если я не ошибаюсь, я хотел бы иметь возможность избегать использования указателей, но я согласен с тем, что проблема, похоже, связана с этой строкой.   -  person CSjunkie    schedule 30.03.2015
comment
@CSjunkie Вы используете массивы, которые, я считаю, по существу эквивалентны указателям с синтаксическим сахаром подписки в квадратных скобках (подробное объяснение здесь).   -  person akivajgordon    schedule 30.03.2015


Ответы (1)


Спасибо за помощь, проблема была в строке board[y-1] = (char)x;. Я нашел более точный способ преобразования int x в char x, который устранил проблему здесь: https://stackoverflow.com/questions/1114741/how-to-convert-int-to-char-c

person CSjunkie    schedule 30.03.2015