Runtime Error UVA10082-WERTYU 解决了RE 用getchar()要小心

Runtime Error UVA10082-WERTYU 解决了RE 用getchar()要小心_第1张图片


AC代码

#include <stdio.h>
#include <string.h>

char str[]="`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
    int c;

    char *p;
    while((c=getchar())!=EOF)
    {
        if(c==32)
            printf("%c", 32);
        else if (c=='\n')
            printf("\n");
        else
        {
            p=strchr(str, c);
            printf("%c" ,*(p-1) );
        }
            //*(strchr(str, c))
    }

    return 0;
}

RE代码

#include <stdio.h>
#include <string.h>

char str[]="`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
    int c;

    char *p;
    while((c=getchar())!=EOF)
    {
        if(c==32)
            printf("%c", 32);
        else
        {
            p=strchr(str, c);
            printf("%c" ,*(p-1) );
        }
            //*(strchr(str, c))
    }

    return 0;
}


细心的同学肯定发现了代码的不同。因为好久没用getchar(),真的是完全忘记了getchar()会读入换行符这个知识点,我记得以前也犯过这种错误。唉,得吸取教训了。当读入换行时,strchr查不到‘\n’,于是返回NULL,这是就出现了re了。

	下面是RE常见原因:
	Runtime Error(ARRAY_BOUNDS_EXCEEDED) // array bounds exceed     数组越界
Runtime Error(DIVIDE_BY_ZERO) //divisor is nil                                   除零
Runtime Error(ACCESS_VIOLATION) //illegal memory access                  非法内存读取
Runtime Error(STACK_OVERFLOW) //stack overflow                             系统栈过载

该题还有更好的代码:

#include <stdio.h>
char s[]="`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
    int i,c;

    while((c=getchar())!=EOF)
    {
        for(i=1;s[i]&&s[i]!=c;i++);
            if(s[i])
                printf("%c", s[i-1]);
            else
                printf("%c",c);
    }

    return 0;
}













你可能感兴趣的:(Runtime Error UVA10082-WERTYU 解决了RE 用getchar()要小心)