[英]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.