Arrays 在C中添加和打印数组元素

Arrays 在C中添加和打印数组元素,arrays,c,printing,Arrays,C,Printing,这是一个函数,它试图执行将CFG转换为Chromsky Normal的第一步,方法是将0->S作为规则添加到规则列表的末尾。我的规则是一个字符数组。出于某种原因,它只会在第一次打印数组,而不会在之后的任何时间打印。我希望它打印输入,然后在编辑数组后打印结果。我不明白为什么它不会打印。输出只是原始输入,然后是空白 更新:现在它将打印两次,但第二次打印的输出与第一次相同。我在数组中添加了“,”,“0”,“>”,“S”作为元素,这不是注册。我是否添加了错误的元素 #include <stdio.

这是一个函数,它试图执行将CFG转换为Chromsky Normal的第一步,方法是将0->S作为规则添加到规则列表的末尾。我的规则是一个字符数组。出于某种原因,它只会在第一次打印数组,而不会在之后的任何时间打印。我希望它打印输入,然后在编辑数组后打印结果。我不明白为什么它不会打印。输出只是原始输入,然后是空白

更新:现在它将打印两次,但第二次打印的输出与第一次相同。我在数组中添加了“,”,“0”,“>”,“S”作为元素,这不是注册。我是否添加了错误的元素

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

//global variables
char stringCFG[200];

//a program to convert CFG to Chromsky Normal Form
int main(int argc, char *argv[]){
  //intialize instance variables
  FILE *CFG;
  FILE *output;
  char ch;
  int RHS= 0;
  int isThereS= 0;
  int howManyItems= 0;

  CFG= fopen(argv[1], "r");
  output= fopen(argv[2], "w");
  
  for (int i=0; i<200; i++){
      fscanf(CFG, "%c", &stringCFG[i]);
      howManyItems++;
      fprintf(output,"%c", stringCFG[i]);
  }
  printf("\n");

  for(int i=0; i<200; i++){
    if(stringCFG[i] == '>'){
      RHS= 1;
    }
    if(stringCFG[i] == ','){
      RHS= 0;
    }
    if(RHS== 1){
      if(stringCFG[i] == 'S'){
        isThereS=1;
      }
    }
  }

  if(isThereS==1){
    stringCFG[howManyItems]= ',';
    howManyItems++;
    stringCFG[howManyItems]='0';
    howManyItems++;
    stringCFG[howManyItems]='>';
    howManyItems++;
    stringCFG[howManyItems]='S';
    howManyItems++;
  }
 for(int i=0; i<200; i++){
   fprintf(output,"%c",stringCFG[i]);
  }
  fclose(CFG);
  fclose(output);
}
#包括
#包括
#包括
//全局变量
char-stringCFG[200];
//CFG转换为Chromsky范式的程序
int main(int argc,char*argv[]){
//初始化实例变量
文件*CFG;
文件*输出;
char ch;
int-RHS=0;
int isThereS=0;
int howManyItems=0;
CFG=fopen(argv[1],“r”);
输出=fopen(argv[2],“w”);

对于(int i=0;i而言,问题似乎在这里:

  for (int i=0; i<200; i++){
      fscanf(CFG, "%c", &stringCFG[i]);
      howManyItems++;
      fprintf(output,"%c", stringCFG[i]);
  }
既然你有:

char stringCFG[200];
然后

将在数组外部写入。这是未定义的行为

读取整个文件后,需要停止第一个循环。类似于:

  for (int i=0; i<200; i++){
      if (fscanf(CFG, "%c", &stringCFG[i]) != 1)
      {
          // No more data
          break;
      }
      howManyItems++;
      fprintf(output,"%c", stringCFG[i]);
  }
顺便说一句:由于您希望能够添加4个额外字符,您可能应该执行以下操作:

char stringCFG[200]; --> char stringCFG[200 + 4];
顺便说一句:反复硬编码值200是一种不好的做法。请改用如下定义:

#define MAX_CHARS 200

并将所有硬编码的
200
替换为
MAX_CHARS
。然后您可以通过编辑一行而不是多行来调整最大值。

Review
while((ch=fgetc(CFG))!=EOF){stringCFG[i]=ch;
。它将
ch
分配给
while
循环中的同一数组元素,因为
i
没有更改。这是真的吗?我将while循环更改为fscanf,但仍然没有打印添加到CFG文件的arrayPost示例输入中的新元素。该文件的大小是多少?i added您的建议,它现在正在打印添加字符到数组并打印!谢谢!出于某种原因,它正在下一行打印添加的字符,知道为什么会发生这种情况吗?@MalialikesCodeing您可能从文件中读取了换行符
  for(int i=0; i<howManyItems; i++){
    if(stringCFG[i] == '>'){
      RHS= 1;
    }
    ...
  }
char stringCFG[200]; --> char stringCFG[200 + 4];
#define MAX_CHARS 200