【发布时间】:2020-12-17 05:40:59
【问题描述】:
这是一个函数,它试图通过将 0->S 作为规则添加到规则列表的末尾来执行将 CFG 转换为 Chromsky Normal From 的第一步。我的规则是一个字符数组。出于某种原因,它只会第一次打印数组,之后不会打印。我希望它打印输入,然后在编辑数组后生成结果。我无法弄清楚为什么它不会打印。输出只是原始输入,然后是空格。
更新:它现在将打印两次,但第二次打印的输出与第一次相同。它没有注册我将 ',','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);
}
【问题讨论】:
-
查看
while((ch = fgetc(CFG)) != EOF){ stringCFG[i]= ch;。它将ch分配给while循环内的相同数组元素,因为i未更改。这真的是故意的吗? -
我将 while 循环更改为 fscanf,但仍未打印我添加到数组中的新元素
-
发布 CFG 文件的示例输入。该文件的大小是多少?