删除C中string数组的空字符串

aiazj4mn  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(158)

我做了一个程序,它从文本文件中逐行读取输出,并将其放入一个数组中。所以我得到了一个字符串数组。
当我检查这个字符串数组并检查这些字符串是否满足特定条件时,问题就出现了。当我形成一个满足特定条件的字符串数组时,我得到了空行作为数组元素。
例如:
文本文件中的表达式:

X&Y
X|Y
!X
(X|Y)|Z
(X&Y)|Z
(X&Y)&Z
(X&Y)|Z&(A|B
((X|Y)|Z)&((A|B)|(C&D))
(X&Y)|(Z&(A|B))
(A|B)&(!C)
A|(B&(C&(D|E)))
((X|Y)|(Z&(A|B)))|((C&D)&(D|E))
(A|B)|(C&D)&(D|E)
!A&(B|C)
(A|B)|(C|D)&(D
!A|(B&C)

当我打印一个新的字符串数组,其元素满足特定条件时,我会得到空行作为元素。

X&Y
X|Y
!X
(X|Y)|Z
(X&Y)|Z
(X&Y)&Z
         //Here
((X|Y)|Z)&((A|B)|(C&D))
(X&Y)|(Z&(A|B))
(A|B)&(!C)
A|(B&(C&(D|E)))
((X|Y)|(Z&(A|B)))|((C&D)&(D|E))
(A|B)|(C&D)&(D|E)
!A&(B|C)
         //Here

有些应该打印的元素因为那些空行而没有打印出来?谁能帮我去掉这些空行?
代码如下:

int main()
{
    FILE *dat;
    int number_of_elements;
    char str[MAX][MAXLEN];
    int NumberOfRightBracket=0;
    int NumberOFLeftBracket=0;
    int NumberOfOperators=0;
    int Number=0;
    int i=0;
    char g[200][MAXLEN];
    dat=fopen("dat.txt","r");
    if(dat==NULL)
    {
        printf("Error");
    }
    while(!feof(dat) && !ferror(dat))
    {
        if(fgets(str[i],100,dat)!=NULL)
        str[i][strcspn(str[i],"\n")] = 0;

        char p[100];
        strcpy(p,str[i]);

        for(int o=0;o<strlen(p);o++)
        {
            if(p[o]=='(')
                NumberOfLeftBracket++;
            else if(p[o]==')')
                NumberOfRightBracket++;
            else if(p[o]=='*' || p[o]=='|' || p[o]=='&' || p[o]=='!')
                NumberOfOperators++;
        }

        if(NumberOfRightBracket!=0 && NumberOfLeftBracket!=0 && NumberOfRightBracket==NumberOfLeftBracket)
        {
           strcpy(g[i],p);
           Number++;

        }
        else if(NumberOfRightBracket==0 && NumberOfLeftBracket==0 && NumberOfOperators==1)
        {
            strcpy(g[i],p);

            Number++;

        }

        NumberOfRightBracket=0;
        NumberOfLeftBracket=0;
        NumberOfOperators=0;
        i++;
    }

   for(int k=0;k<Number;k++)
   {
     printf("%s\n",g[k];
   }

}
siv3szwd

siv3szwd1#

您使用i来决定在g中的什么位置存储来自输入的每一行,并且i在每次迭代中递增,但是您使用Number来计算保留的字符串的数量,并且仅在保留字符串时递增Number
结果是各种g[i],其中您决定不保留字符串,永远不会用行中的数据更新,但您会打印它们。
您不需要同时使用iNumber。只需使用一个变量来跟踪到目前为止有多少行以及将下一行放在g中的什么位置。
(You如果程序只应该执行它当前似乎正在尝试的操作,则也不需要g。)

相关问题