簡體   English   中英

在 C 中添加和打印數組元素

[英]Adding and Printing elements of an array in C

這是一個 function,它試圖通過將 0->S 作為規則添加到規則列表的末尾來執行將 CFG 轉換為 Chromsky Normal From 的第一步。 我的規則是一個字符數組。 出於某種原因,它只會第一次打印數組,之后不會打印。 我希望它打印輸入,然后在編輯數組后生成結果。 我無法弄清楚為什么它不會打印。 output 只是原始輸入,然后是空格。

更新:現在將打印兩次,但第二次打印的 output 與第一次相同。 它沒有注冊我將 ',','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);
}

問題似乎在這里:

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

不管文件中有什么,這個循環總是執行 200 次。 換句話說 - 循環完成后howManyItems的值將是 200。

您可以通過在循環后打印howManyItems來檢查,即

printf("After loop, howManyItems=%d\n", howManyItems);

既然你有:

char stringCFG[200];

然后

stringCFG[howManyItems]= ',';  // bad.. writing to stringCFG[200]
howManyItems++;
stringCFG[howManyItems]= '0';  // bad.. writing to stringCFG[201]
howManyItems++;
...

將寫入數組之外。 那是未定義的行為。

讀取整個文件后,您需要停止第一個循環。 就像是:

  for (int i=0; i<200; i++){
      if (fscanf(CFG, "%c", &stringCFG[i]) != 1)
      {
          // No more data
          break;
      }
      howManyItems++;
      fprintf(output,"%c", stringCFG[i]);
  }

然后所有以下循環都必須使用howManyItems作為上限。

喜歡

  for(int i=0; i<howManyItems; i++){
    if(stringCFG[i] == '>'){
      RHS= 1;
    }
    ...
  }

順便說一句:由於您希望能夠添加 4 個額外的字符,您可能應該這樣做:

char stringCFG[200]; --> char stringCFG[200 + 4];

順便說一句:一遍又一遍地硬編碼值 200 是不好的做法。 而是使用如下定義:

#define MAX_CHARS 200

並將所有硬編碼的200替換為MAX_CHARS 然后您可以簡單地通過編輯一行而不是多行來調整最大值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM