2015-01-16 2 views
-1

работает над заданием для университета, и мне нужно использовать strtok для ввода пользователей для сетки, например b1 - d4 будет перемещать кусок с b1 на d4. В настоящее время я использую strtok для разделения b1-d4 на startPosition b1 и конечную позицию d4. Теперь я хочу разбить этот b1 на «b» и «1», чтобы я мог преобразовать b в целое число из 1 (потому что оно начинается с 0) и 1 до целых чисел 0. Это мой код для этого бита, поэтому далеко:Как разбить символ?

{ 
char input[20]; 
char *start, *end; 
int n = 0; 

fgets(input, 20, stdin); 
/* clear new line */ 
input[strlen(input)-1]='\0'; 
/* Extract first string */ 
if(strlen(input)==0) return 0; 

start=strtok(input, DELIMS); 
printf("%s\n", start); 
n++; 
while(n < 2){ 
end=strtok(NULL, DELIMS); 
if (end == NULL) break; else n++; 
printf("%s\n\n", end); 
} 

} 

так в основном это получает входной сигнал и хранить его в начале и в конце, так что в случае перемещения b1 - d4 я буду * начать = b1 * конец = d4. Часть, с которой я борюсь, теперь разделяет char * start на два символа или массив символов «b» и «1». Неужели я все это делаю неправильно? Спасибо заранее.

+0

Вместо того, чтобы смотреть на ответы, сделайте небольшое исследование эквивалентности указателя и массива в C, и, надеюсь, вы поймете, что вам нужно делать. Как бы то ни было, ваш вопрос не показывает никаких исследований. –

ответ

2

Если маркер всегда будет иметь такую ​​же длину, как раз

char b; 
int x; 

b = token[0] - 'a'; 
x = (int)(token[1] - '0') - 1; 

предположить, что token указывает на строку "b1", то b будет иметь значение символа b и x будет целое 1. Вы должны проверить, что токен является разделяемым, то есть он имеет 2 символа.

Строки в C не что иное, как последовательность байтов прерванных специальным символом '\0', так, например strlen() подсчитывает, сколько байтов, где до '\0' встречается.

Так как маркер представляет собой указатель на память, где эти байты хранятся, используя оператор индекса массива разыменовывает указатель после продвижения его по значению индекса т.е. token[0] == *token; и token[1] == *(token + 1); Надеюсь, что это проясняет.

Если вы хотите, чтобы преобразовать b в целое, вы должны заботиться о верхнем регистре, так что вы можете захотеть сделать что-то вроде

int b_integer; 

if (b >= 'a') 
    b_integer = b - 'A'; 
else 
    b_integer = b - 'a'; 

: Рекомендации для

Не намеренно используйте функцию strlen() для вычисления длины строки, длина не сохраняется в любом месте, а strlen() вычисляет ее при каждом вызове, поэтому вы должны фактически сохранить возвращаемое значение и использовать его.

Кроме того, вы никогда не проверяете, вернул ли первый звонок strtok() значение не NULL.

+0

Огромное вам спасибо, я не могу поверить, что не понимал, что он хранится в манере, доступной с помощью [0] и [1]. Я считал, что это символ «b1», а не массив из [b] и [1] спасибо! – Rrr

+0

Вопрос asks b должен быть преобразован в целое число, где вы преобразовываете его в целое число, которое вы просто сохраняете itvas char – Gopi

+0

Извините, преобразование равно 1 = 0, 2 = 1, 3 = 2 и т. Д. - a = 0, b = 1, c = 2 и т. Д. – Rrr

2

Учитывая ваш непросроченного маркера будет иметь формат <single_letter><one_digit_number>, вы можете использовать индекс, чтобы получить значение.

Например,

start=strtok(input, DELIMS); 

Теперь, если начало содержит A1,

  • start[0] является A
  • start[1] является 1 [ASCII]

Если вы хотите получить соответствующее значение int ASCII, хранящееся в start[1], вы можете просто использовать int move = (start[1] - '0'), который даст вам значение intкак a int.

0

Для вашего вопроса:

так что я могу преобразовать б в целое число от 1 (так как он начинается с 0) и 1 на целое число от 0

Проверьте код ниже:

char *p = "b1"; 
int a,b; 

a = (int) (p[0] - 97); 
b = (int) (p[1] - '0'); 
Смежные вопросы