为大学分配工作,我需要使用strtok来获取网格的用户输入,例如b1 - d4会将一个部分从b1移动到d4。我目前正在使用strtok将b1 - d4拆分为b1的startingPosition和d4的结束位置。现在我想把这个b1分成" b"和" 1"所以我可以将b转换为1的整数(因为它从0开始)和1到a 整数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的情况下,我将有* start = b1 * end = d4。我正在努力的部分现在将char * start分成两个字符,或者是一个字符串&#34; b&#34;和&#34; 1&#34;。我错了吗? 提前谢谢。
答案 0 :(得分:1)
如果您的令牌总是具有相同的长度
char b;
int x;
b = token[0] - 'a';
x = (int)(token[1] - '0') - 1;
假设token
指向字符串"b1"
,则b
将具有字符b
的值,x
将为整数{{ 1}}。您必须检查令牌是否可拆分,即它有2个字符。
c中的字符串只是由特殊字符1
终止的字节序列,因此例如'\0'
计算遇到strlen()
之前的字节数。
由于token是指向存储这些字节的内存的指针,因此使用数组下标运算符在通过索引值('\0'
和token[0] == *token;
推进指针值之后取消引用指针,我希望这可以澄清。< / p>
如果你想将token[1] == *(token + 1);
转换为整数,你也应该处理大写,所以你可能想做类似的事情
b
推荐:
不要故意使用int b_integer;
if (b >= 'a')
b_integer = b - 'A';
else
b_integer = b - 'a';
函数计算字符串的长度,长度不会存储在任何地方,strlen()
会在每次调用时计算它,因此您应该实际存储返回的值和用那个。
此外,您永远不会检查第一次拨打strlen()
是否返回了非strtok()
值。
答案 1 :(得分:1)
考虑到 vaild 令牌的格式为<single_letter><one_digit_number>
,您可以使用 index 来获取值。
例如,
start=strtok(input, DELIMS);
现在,如果开始包含A1
,
start[0]
是A
start[1]
是1
[ASCII] 如果您希望获得int
中存储的ASCII的相应start[1]
值,您只需使用int move = (start[1] - '0')
即可获得int
值 as int
。
答案 2 :(得分:0)
对于你的问题:
所以我可以将b转换为1的整数(因为它从0开始)和1 到0的整数
检查以下代码:
char *p = "b1";
int a,b;
a = (int) (p[0] - 97);
b = (int) (p[1] - '0');