纯模拟,双指针,逐个判断。
#include<stdio.h>
#include<string.h>

//检查每一次的输入是否正确,不正确返回-1,正确则返回移动的距离。
int check(char *s,int left,int right){
    int value = 0;
    int len = right - left;
        //输入长度是否合法
    if(len > 3 || len < 2) return -1;
        //第一个字符是否合法
    switch(s[left]){
        case 'A':
        case 'S':
        case 'W':
        case 'D':
                        //数字字符是否合法
            if(len==2){
                if(s[left+1]<'0'||s[left+1]>'9') return -1;
                else return s[left+1] - '0';
            }
            else{
                if(s[left+1]<'0'||s[left+1]>'9') return -1;
                if(s[left+2]<'0'||s[left+2]>'9') return -1;
                                //两位数的距离。
                return (s[left+1] - '0')*10 + s[left+2] - '0';
            }
        default:return -1;
    }
    return value;
}

int main(){
    char s[10001] = {0};
    scanf("%s\n",s);
    int x = 0;
    int y = 0;
        //双指针限制每次的输入,left指向起点,right指向每个分号。
    int left = 0;
    int right = 0;
    int len = strlen(s);
    for(int i = 0; i < len; i++){
        int temp = 0;
        if(s[i]==';'){
            right = i;
            temp = check(s, left, right);
                        //如果移动距离合法,则根据情况修改坐标。
            if(temp!=-1){
                switch(s[left]){
                    case 'A':x = x - temp;break;
                    case 'S':y = y - temp;break;
                    case 'W':y = y + temp;break;
                    case 'D':x = x + temp;break;
                }
            }
                        //left移动到下一个输入的起点
            left = right+1;
        }
    }
    printf("%d,%d",x,y);
    return 0;
}