题解 | #坐标移动#
坐标移动
https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
#include <stdio.h> #include <stdlib.h> #include <string.h> /* 先说说这个题的解题思路: 相信明眼人一看就能想到,这个题必然是先进行字符串分割,然后对每个小字符串单独判断是否符合移动的要求 1.本解法采用strtok()函数,每次分割完就进行判断, 2.判断时如果首字符不是A~Z之间的,那么直接判断不符合,也就是退出判断 3.如果首字符属于A~Z之间,则继续判断后面的,若后面的存在非数字(只要出现过就退出),即不是0~9之间的数,那么就退出判断函数 4.如果首字符属于A~Z,且后面没有出现非数字,那么可以调用移动函数,移动的数字使用atoi()函数获取 再说说踩到的坑: 1.本来想着用C++的方式,发现strtok识别不了string类型,哪怕是用了.c_str()转换都不行,因为得到的不是const 2.分割字符串后没有立即判断分割得到的字符串是不是为NULL就直接调用判断,导致了程序段错误 3.判断首字符后面是否有非数字时想复杂了,不需要再判断是否到“;”,因为传进来的时候就没有了“;”,以这个分割 */ int x = 0, y = 0; char str[10000] = ""; void move(char c, int n); void isMove(char* s); int main() { // 输入操作字符串 scanf("%s", str); // 分割字符串 const char* c = ";"; // 用于分割字符串的 分号 ; char* tok = strtok(str, c); if (tok != NULL) { isMove(tok); } while (tok != NULL) { tok = strtok(NULL, c); if (tok != NULL) { isMove(tok); } } printf("%d,%d", x, y); return 0; } // 移动函数 void move(char c, int n) { switch (c) { case 'A': x -= n; break; case 'S': y -= n; break; case 'D': x += n; break; case 'W': y += n; break; } } // 判断是否需要移动 void isMove(char* s) { char* p1 = s; char* p2 = s; if (*p1 >= 'A' && *p1 <= 'Z') { ++p1; // 如果出现首字母后面不是数字,则退出 while (*p1) { if (*p1 < '0' || *p1 > '9') { return; } ++p1; } } else { return; } move(*s, atoi(s + 1)); }