题解 | #坐标移动#

坐标移动

http://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29

坐标移动:C语言解法

此方法可以运用到实际的项目中,用来判断键盘上WASD按得时长,从而得到行走的距离来获取当前点的坐标。

#include<stdio.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);
}
全部评论
你好,请问那个num *= 10;的用意是什么啊 还有它下一句也不太懂,
1 回复 分享
发布于 2022-04-04 16:40
这个算法没有限定输入的字符长度呀,输入A100会向左移动一百,应该在judgenum前判断读取了几个字符。
1 回复 分享
发布于 2023-02-19 12:36 安徽
进一位数,权值乘10,下一句进来的数的ascii码相加减
点赞 回复 分享
发布于 2022-07-24 19:32
为什么memcpy里 数据源指针是str-size-1?这时候str不是在“;”上吗?应该是str-size?
点赞 回复 分享
发布于 06-13 13:29 江苏

相关推荐

18 2 评论
分享
牛客网
牛客企业服务