構成ファイルを1行ずつ読み取ってから、結果をトークン化して別の変数に保存しようとしています。私の設定ファイルは次のようになります
stage 1
num_nodes 2
nonce 234567
行の各値を個別にトークン化する必要があるため、たとえば、最初の行の「ステージ」では、構成ファイルからステージ値を読み取ったかどうかを確認し、その値を変数に保存します。私のトークン化は正しく機能しているようです。ただし、トークン化後に変数を操作しようとすると、セグメンテーション違反が発生します。せいぜい変数の 1 つ、つまり stage または num_nodes または nonce のいずれかを正常に操作できますが、それらの組み合わせは操作できません。みたいなことをしようとしても
stage = stage + 1;
num_nodes = num_nodes + 1;
ただし、次のように 1 つの変数だけを変更すると、セグメンテーション エラーが発生します。
num_nodes = num_nodes + 1;
その後、正常に動作します。以下のコードを貼り付けています。ここで何が欠けているか教えてください。
main(int argc, char *argv[]){
int nonce;
int num_nodes;
int stage;
char filename[256];
char *token1, *token2, *str;
FILE* fp;
char bufr[MAXLINE];
printf("Please enter config file name\n");
scanf("%s",filename);
printf("You entered %s\n", filename);
if((fp = fopen(filename, "r")) != NULL){
while(fgets(bufr, MAXLINE, fp) != NULL){
if(bufr[0] == '#') // to skip comments
continue;
printf("This is bufr: %s", bufr);
str = bufr;
for(str; ;str = NULL){
token1 = strtok(str, " ");
if(strcmp(token2, "num_nodes") == 0){
num_nodes = atoi(token1);
printf("num_nodes = %d\n", num_nodes);
}
if(strcmp(token2, "nonce") == 0){
nonce = atoi(token1);
printf("nonce = %d\n", nonce);
}
if(strcmp(token2, "stage") == 0){
stage = atoi(token1);
printf("stage = %d\n", stage);
}
token2 = token1; // making a copy of pointer
if(str == NULL){
break;
}
}//end of for loop
}//end of while loop
fclose(fp); //close the file handle
}
else{
printf("failed, file not found!\n");
}
/* This is where the segmentation fault kicks in, try to uncomment two lines and it will give a segmentation fault, if uncomment just one, then it works fine.
nonce = nonce + 2;
num_nodes = num_nodes + 1;
printf("stage = %d\n", stage);
*/
}