gpt4 book ai didi

c - 额外的错误?他们在哪里、是什么? C语言编程

转载 作者:行者123 更新时间:2023-11-30 20:22:25 25 4
gpt4 key购买 nike

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

ERROR MESSAGES HERE

#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*/
}

最佳答案

最重复的错误似乎是:

    *word = iochar;
*word++;

虽然这样做很好:

    *word++ = iochar;

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

    *word = iochar;
word++;

我看到的下一个最重复的问题是,您在返回之前重置局部变量,它不会阻止您的代码编译或运行 - 一旦您调用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 */
}

关于c - 额外的错误?他们在哪里、是什么? C语言编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39542899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com