关于Run-Time Check Failure #2

     这个问题源自《The C Programming Language》P49 p3-2习题中,当输入一系列字符串后,再键入Ctrl - Z时,出现了。

 

     代码:

     #include <stdio.h> #define MAXLINE 100 int getLen(char s[], int lim); char* escape(char t[], char s[]); int main() { int len = 0; char line[MAXLINE] = {'/0'}; char str[MAXLINE] = {'/0'}; while((len = getLen(line, MAXLINE)) > 0) printf("%s/n", escape(str, line)); return 0; } int getLen(char s[], int lim) //从终端读入字符存在在s中,返回其长度 { int i, c; for(i = 0; i < lim-1 && (c = getchar()) != EOF && c != '/n'; ++i) s[i] = c; if(c == '/n') { s[i] = c; ++i; } s[i] = '/0'; return i; } char* escape(char t[], char s[]) //将'/t','/n'转换成可见的转义字符序列 { int c, i, j; i = j = 0; while((c = s[j]) != '/0') //不要写成while((c = s[j]) != EOF) { switch(c) { case '/n': t[i++] = '//'; t[i] = 'n'; break; case '/t': t[i++] = '//'; t[i] = 't'; break; default: t[i] = s[j]; break; } ++i; ++j; } t[i] = '/0'; return t; }

     当用L45的注释代替本身的while语句时,出现了上述错误,见下图:

     CRT

 

     分析:

 

     1,  这个错误一般是因为给变量分配的空间出现越界访问导致的(绝大部分是数组越界),当L45中的while中的判读条件为:

          (c = s[j]) != EOF时,就会导致这个错误的出现,修改成(c = s[j]) != '/0',则问题解决。

          原因:EOF是文件结尾符,而'/0'是字符串结尾符,例如s = "abdc/0",本来原意是当while循环执行到s[4] = '/0'时,就

          要结束函数escape了,但由于此时判断条件是eof,故当s[j] = '/0',仍然进入while的循环体继续执行里面的语句,这样

          就将s[4]之后的95个'/0'全部都赋给t字符串了,当执行到c = s[99] != EOF时,仍然进入while循环体,导致++j,

          j = 100,然后又调回到while判断条件中执行c = s[100] != EOF,此时问题来了,当执行c = s[100]时,访问字符

          s[100]时,出现了越界情况(s数组的最大访问下标为99),所以出现了上述错误。

 

 

 

 

你可能感兴趣的:(c,终端)