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