【问题标题】:Extraneous Errors? Where & What Are They? C Programming无关的错误?它们在哪里以及它们是什么? C 编程
【发布时间】:2016-09-17 04:39:01
【问题描述】:

我的代码已经反复校对,但我仍然无法弄清楚为什么其中一些行会发出错误消息。只有一个“}”的行被称为错误。这怎么可能?

#include <stdio.h>
#include <getword.h>
#define  STORAGE 255

int getword(char *w) {

char *word = w; /*points to first char in array */
char iochar; /*holds current var being processed */
int counter = 0; /* counts number of characters in a word */
char *first = w; /* points to first character in array */
int  bslashflag = 0; /* 0 if no backslash seen, 1 otherwise */
int negateornah = 0; /* if set to 1, return value is negated */

while( ( iochar = getchar() ) != EOF ) { /*runs until EOF is encountered */

if( iochar =='\\')      /* if a slash char is found in the word*/
{   bslashflag = 1;             /*acknowledge that*/
                    /*backslash was seen*/
    iochar = getchar();       /* skip it & go to the next char*/
    if(iochar == '\' ){        /*and if it ends up being another*/
                /*slash, slash designated to be added in */
        *word = iochar;   /* so go ahead and add it in */
        *word++;         /* and go to the next empty slot */
        counter++;  /*and increment your counter */
        iochar = getchar();  /* *ALERT << may or may not beneccessary */
    } else if( iochar == '<' || iochar == '>' || iochar == '|' || iochar == '$' || iochar == '&' )
          {     /* if a metacharacter is found after a bslash, */
                        /*just treat it like any other character*/ 
        *word = iochar;
        *word++;
        counter+=1;
          }
}       
else if (iochar == ' ') 
{
    if(counter == 0) //*f the first char is a space */
    {      
    while( (iochar = getchar() ) == ' ') { } /*skips leading blanks*/

    } else if(bslashflag == 1) { /*if there was bslash before space*/
        *word++ = iochar;       /*add the space as part of string*/
    counter++;  /*increments counter*/
    bslashflag--; /*resets backslash flag for next char check*/
    } 
    else 
    {           /* until alphanum char is found*/
          *word = '\0';  /*if not leading blank, its the end of word*/

      if(negateornah == 1) 
      {
        negateornah= 0; /*reset flag for next run*/
        counter *= -1; /*negate the value in counter*/
        return counter;
      }

      return counter; /* return word size */
    }
}

else if( iochar == '\n' || iochar == '<' || iochar == '>' || iochar == '|' || iochar == '$' || iochar == '&' ) 
{       /*if a metacharacter is encountered*/

    if(iochar == '\n' && counter == 0) /* if the first char in the word is \n */ 
    {
        *word  = '\0'; /* and null terminate the array; TRY *first INCASE OF ERROR*/
        if(negateornah == 1) {
            negateornah= 0; /*reset flag for next run*/
            counter *= -1; /*negate the value in counter*/
            return counter;
        }
        return counter; /* null terminate the array and return count so scan can continue*/
    } 
    else if(iochar == '\n' && counter != 0)
    {
        *word = '\0' ;
        ungetc('\n',stdin); /* put it back where you got it*/
        if(negateornah == 1) {
            negateornah= 0; /*reset flag for next run*/
            counter *= -1; /*negate the value in counter*/
            return counter;
        }
        return counter;     /*and return a number so the scan can continue*/
    }

    else if(iochar == '$') 
    {
        if(counter ==0) {
            negateornah = 1;  } /*means $ was first char in word, set negate count flag*/
        if(bslashflag == 1) /* if a backslash was seen before this character*/
        {           
            *word = iochar; /* just add it into the word*/

            *word++;    /* as part of the string*/
            counter++;  /* and count it as a letter*/
            bslashflag=0;  /*reset flag for next check*/
        }
        *word++ = iochar; /*add it into word*/

        counter++;  /*and account for addition*/
        return counter;

    }

    else if(iochar == '|') {
        if(counter==0){
            *word = iochar;
            *word++;
            counter++
            return counter;
        }
        if(bslashflag == 1) {
            *word = iochar;
            *word++;
            counter++;
            int bslashflag = 0;
        }
        if(negateornah == 1) {
            negateornah= 0; //reset flag for next run*/
            counter *= -1; //negate the value in counter*/
            return counter;
        }
        return counter;
    }

    else if(iochar == '&') {
        if (counter ==0) {
            *word++ = iochar;
            *word = '\0';
            counter++;
            return counter;
        }
        if(bslashflag == 1) {
            *word = iochar;
            *word++;
            counter++;
            bslashflag = 0;
        }
        if(negateornah == 1) {
            negateornah= 0; /*reset flag for next run*/
            counter *= -1; /*negate the value in counter*/
            return counter;
        }
        return counter;
    }

    else if( iochar == '<' || iochar == '>') {
        if(counter==0){
            *word++ = iochar;
            *word = '\0';
            return counter;
        }
        if(bslashflag==1) {
            *word = iochar;
            *word++;
            counter++;
            bslashflag = 0;
        }
        if(negateornah == 1) {
            negateornah= 0; /*reset flag for next run*/
            counter *= -1; /*negate the value in counter*/
            return counter;
        }
        return counter;

    } 

    else if (iochar == ' ') /* if space is encountered*/
    {
        if(bslashflag == 1){ /* if a backslash was seen before this*/
            *word = iochar;
            *word++;
            counter++; 
            bslashflag = 0;
        }
            else if(counter == 0)  /* as the first character */
                {   
            while( (iochar = getchar() ) == ' ') { } /*keep going until*/
            }

        else {                  /* iochar is not a space*/
                    *word = '\0'; /* this block handles the word ending    space*/

            if(negateornah == 1) {
            negateornah= 0; /*reset flag for next run*/
            counter *= -1; /*negate the value in counter*/

            return counter;
                }
         return counter; /* by null terminating the word at the end*/
        }           /* and returning the count and printed word*/
    }

    *word++ = iochar; /* add iochar into the array if its an alphanum char*/
    counter+=1; /* increment counter to reflect added char*/
    }


    *word = '\0'; /* if EOF is encountered*/
    *first = '\0'; /* null terminate entire word, clearing it from the array*/
    if(counter != 0){
        if(negateornah == 1) {
            negateornah= 0; /*reset flag for next run*/
            counter *= -1; /*negate the value in counter*/
            return counter;
        }
        return counter; /*ensure word continues in next run*/
        }
    return -1;      /*and return -1 for EOF*/
}

【问题讨论】:

  • iochar == '\' 应该是 iochar == '\\'。但还有其他问题。
  • counter++ --> counter++;
  • 一次处理一个错误。或者,处理报告的第一个错误。看看下一个是否有意义。如果不是,则可能是第一个错误的结果,只需尝试重新编译即可。如果下一个错误是有意义的,那么也修复它并继续下一个,等等。重复直到错误全部解决。 (然后返回并在编译器选项中添加更多警告,然后重复整个练习。)请不要显示错误消息的图片。将它们作为“代码”包含在您的问题中。 getword.h 标头是否可以自行编译?我们需要知道里面有什么吗?
  • 另外,请确保错误消息中的行号与您嵌入问题的代码中的行号相对应。第一个错误指的是图像中的第 27 行,但指的是问题中显示的代码中的第 20 行。这种差异充其量是令人讨厌的。 (第一个问题是“缺少终止' 字符”;这适用于if(iochar == '\' ){,从评论来看可能应该是if(iochar == '\\' ){。修复它!我不清楚下一个错误是什么意思——也许是重新编译。)

标签: c debugging compiler-construction extra


【解决方案1】:

重复最多的错误似乎是:

    *word = iochar;
    *word++;

虽然这样做很好:

    *word++ = iochar;

如果要拆分两个步骤(间接设置值;递增指针)正确的做法是:

    *word = iochar;
    word++;

我看到的下一个最重复的问题,它不会阻止您的代码编译或运行,是您在 return 之前重置局部变量 - 没有意义,一旦您调用 return 他们就是全部消失,不会延续到下一次通话。

在那之后,你的缩进风格就开始妨碍你了——选择一个并严格地坚持下去。即使您在另一个程序中使用不同的样式,也没关系,只要在文件中保持一致即可。

最后,不要在没有编译和测试的情况下编写这么多代码。你永远不应该有这么多错误需要追查。在添加新代码块时,逐步编译和测试。

应用上述修复和建议,以及其他人建议的修复,并将您的代码翻译成 C ;-) 这是一个可以编译的返工。这并不意味着它是正确的,只是编译器充分接受它,您可以开始真正的调试:

#include <stdio.h>
#include <stdbool.h>
// #include <getword.h>

int getword(char *w) {

    char *word = w; /* points to first char in array */
    char iochar; /* holds current var being processed */
    int counter = 0; /* counts number of characters in a word */
    char *first = w; /* points to first character in array */
    bool bslashflag = false; /* false if no backslash seen, true otherwise */
    bool negateornah = false; /* if true, return value is negated */

    while ((iochar = getchar()) != EOF) { /* runs until EOF is encountered */

        if (iochar == '\\') { /* if a slash char is found in the word */

            bslashflag = true; /* acknowledge that backslash was seen */
            iochar = getchar(); /* skip it & go to the next char */

            if (iochar == '\\' ) { /* and if it ends up being another */
                /* slash, slash designated to be added in */
                *word++ = iochar; /* add it in and go to the next empty slot */
                counter++; /* and increment your counter */
                iochar = getchar(); /* *ALERT << may or may not be neccessary */
            } else if (iochar == '<' || iochar == '>' || iochar == '|' || iochar == '$' || iochar == '&' ) {
                /* if a metacharacter is found after a backslash, */
                /* just treat it like any other character */ 
                *word++ = iochar;
                counter++;
            }
        } else if (iochar == ' ') {
            if (counter == 0) { /* if the first char is a space */
                while ((iochar = getchar()) == ' ') {
                    /* skip leading blanks */
                }

            } else if (bslashflag) { /* if there was bslash before space */
                *word++ = iochar; /* add the space as part of string */
                counter++; /* increment counter */
                bslashflag = false; /* reset backslash flag for next char check */
            } else { /* until alphanum char is found */
                *word = '\0'; /* if not leading blank, its the end of word */

                if (negateornah) {
                    counter *= -1; /* negate the value in counter */
                }

                return counter; /* return word size */
            }
        } else if (iochar == '\n' || iochar == '<' || iochar == '>' || iochar == '|' || iochar == '$' || iochar == '&' ) {
            /* if a metacharacter is encountered */

            if (iochar == '\n' && counter == 0) { /* if the first char in the word is \n */ 
                *word = '\0'; /* and null terminate the array; TRY *first INCASE OF ERROR */
                if (negateornah) {
                    counter *= -1; /* negate the value in counter */
                }
                return counter; /* null terminate the array and return count so scan can continue */

            } else if (iochar == '\n' && counter != 0) {
                *word = '\0' ;
                ungetc('\n', stdin); /* put it back where you got it */
                if (negateornah) {
                    counter *= -1; /* negate the value in counter */
                }
                return counter; /* and return a number so the scan can continue */

            } else if (iochar == '$') {
                if (counter == 0) {
                    negateornah = true; /* means $ was first char in word, set negate count flag */
                } 
                if (bslashflag) { /* if a backslash was seen before this character */

                    *word++ = iochar; /* just add it into the word as part of the string */
                    counter++; /* and count it as a letter */
                }
                *word++ = iochar; /* add it into word */

                return counter + 1; /* and account for addition */

            } else if (iochar == '|') {
                if (counter == 0) {
                    *word++ = iochar;
                    return counter + 1;
                }
                if (bslashflag) {
                    *word++ = iochar;
                    counter++;
                }
                if (negateornah) {
                    counter *= -1; /* negate the value in counter */
                }
                return counter;

            } else if (iochar == '&') {
                if (counter == 0) {
                    *word++ = iochar;
                    *word = '\0';
                    return counter + 1;
                }
                if (bslashflag) {
                    *word++ = iochar;
                    counter++;
                }
                if (negateornah) {
                    counter *= -1; /* negate the value in counter */
                }
                return counter;

            } else if (iochar == '<' || iochar == '>') {
                if (counter == 0) {
                    *word++ = iochar;
                    *word = '\0';
                    return counter;
                }
                if (bslashflag) {
                    *word++ = iochar;
                    counter++;
                }
                if (negateornah) {
                    counter *= -1; /* negate the value in counter */
                }
                return counter;

            } else if (iochar == ' ') { /* if space is encountered */
                if (bslashflag) { /* if a backslash was seen before this */
                    *word++ = iochar;
                    counter++; 
                    bslashflag = false;
                } else if (counter == 0) { /* as the first character */

                    while ((iochar = getchar() ) == ' ') {
                        /* keep going until iochar is not a space */
                    } 
                } else {
                    *word = '\0'; /* this block handles the word ending space */

                    if (negateornah) {
                        counter *= -1; /* negate the value in counter */
                    }
                    return counter; /* by null terminating the word at the end */
                } /* and return the count and printed word */
            }

            *word++ = iochar; /* add iochar into the array if its an alphanum char */
            counter++; /* increment counter to reflect added char */
        }


        *word = '\0'; /* if EOF is encountered */
        *first = '\0'; /* null terminate entire word, clearing it from the array */

        if (counter != 0) {
            if (negateornah) {
                counter *= -1; /* negate the value in counter */
            }
            return counter;
        }
    }

    return -1; /* and return -1 for EOF */
}

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 2022-08-13
    • 1970-01-01
    • 2016-12-31
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2015-05-30
    相关资源
    最近更新 更多