题解 | #坐标移动#
坐标移动
https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
/******************** **借鉴别人的,malloc需要释放,另加了头文件和free; memset初始化可用,memcpy将特定长度的字符串复制到另一个字符**串;&str[1]参与函数内部运算时只取【1】及之后地址。 *******************/ #include<stdio.h> #include<string.h> #include<stdlib.h> //用来判断WASD后面接的是否是合法的数字,否则返回0,不影响结果 int judgeNum(char *str){ int len = strlen(str), num = 0; for(int i=0; i<len; i++){ if(str[i] >= '0' && str[i] <= '9'){ num *= 10; num += (str[i] - '0'); }else{ //当有任何字符不合法时都会返回0 return 0; } } return num; } int main(){ int x=0, y=0, size=0; //在堆区申请大小为10000字节的空间 char *str = (char *)malloc(10000); char step[10] = {0}; scanf("%s\n",str); //判断字符串是否到了结尾 while(*str != NULL){ size = 0; //可以把每个分号看成一个步骤,获取每个步骤的长度 while(*str++ != ';') { size++; } memset(step, 0, sizeof(step)); //把每个步骤拷贝到字符数组里,方便判断,当然也可以不拷贝直接把指针和步长传给judegeNum memcpy(step, str-size-1, size); switch(step[0]){ //如果第一个字符为上下左右,就根据judgeNum返回的数值进行加减 case 'A': x-=judgeNum(&step[1]); break; case 'D': x+=judgeNum(&step[1]); break; case 'W': y+=judgeNum(&step[1]); break; case 'S': y-=judgeNum(&step[1]); break; //如果是其他,就跳过 default: break; } } printf("%d,%d\n",x,y); free(*str); return 0; }