题解 | #坐标移动#

坐标移动

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;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务