为什么我的变量在 strtok() 和 fgets() 之后改变而不修改它?
Why does my variable change after strtok() and fgets() without modifying it?
这里的问题演示:http://goo.gl/71U1xA
我正在读取一个文件,在该文件中有一行:
SECTIE FIELD_IN #define ENDSEC
表示我需要将这一行之后的行存储到一个变量中,但是 仅 如果该行包含部分“#define
”。
所以,我遍历文件,当该行包含“SECTIE
”和“FIELD_IN
”时,它会检索其中包含 #
的单词并存储它在变量 keyWord
.
中
现在的问题是:keyWord
中的值在下一个循环中改变了,没有修改它。
我的文本文件是:
SECTIE FIELD_IN1 #define ENDSEC
#define COL1 1,1
#define COL2 2,3
#define COL3 5,3
...etc
我的代码输出是这样的:
START
reading line
text=SECTIE FIELD_IN1 #define ENDSEC
keyword1=..
new sectie
keyword2=.#define.
reading line
text=#define COL1 1,1
keyword1=. 1,1
.
start = 1!
keyword3=. 1,1
.
我的代码:
int x, status, start;
char inputLine[5000 + 1];
char copyLine[5000 + 1];
char *keyWord = "";
FILE *iFile;
status = NOERROR;
x = 0;
start = 0;
iFile = fopen(gsz_inputFile, "r");
if(iFile == NULL){
status = ER_OPEN;
return status;
}
while (fgets(inputLine, sizeof(inputLine), iFile) != NULL){
printf("\n\nreading line");
printf("\ntext=%s", inputLine);
printf("\nkeyword1=.%s.", keyWord);
strcpy(copyLine, inputLine);
strlwr(copyLine);
if(strstr(copyLine, "sectie") != NULL && strstr(copyLine, "field_in") != NULL){
start = 1;
printf("\nnew sectie");
//get keyword
keyWord = strtok(inputLine," ");
while (keyWord != NULL)
{
if(strstr(keyWord, "#") != NULL){
break;
}
keyWord = strtok(NULL, " ");
}
printf("\nkeyword2=.%s.", keyWord); //here the keyword is correct
continue;
}
if(start){
printf("\nstart = 1!");
printf("\nkeyword3=.%s.", keyWord);
//status = storeString(inputLine, keyw, x); //my actual code is different
if(status != NOERROR){ x--; }
x++;
}
}
我觉得跟while (fgets(inputLine, sizeof(inputLine), iFile) != NULL)
有关系,因为那行执行后,值变了
为什么进入下一个循环后keyWord
的值变了?我猜这与未定义的行为有关,但我不能指出这个问题。
strtok
修改输入缓冲区。所以你在循环结束时得到的 keyword
是一个指向 inputLine
中的位置的指针。当循环使用 fgets
读取另一行时,它会被覆盖。
你有 inputLine
这是一个数组。在其中存储 fgets()
:
获取的字符串
while (fgets(inputLine, sizeof(inputLine), iFile) != NULL){
在你的循环中你说 keyWord
指向某个 inputLine 的标记(这意味着它指向你的数组中的某个地方)。
//get keyword
keyWord = strtok(inputLine," ");
当你 运行 第二个 fgets()
数组内容改变时,但它的地址没有改变,所以 keyWord 仍然指向 inputLine 内容的已经改变
示例:
first fgets():
inputLine: ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
keyWord-->""
second strtok:
keyWord------------------------------------^
second fgets():
inputLine: ['T', 'h', 'i', 's', ' ', 'c', 'h', 'a', 'n', 'g', 'e']
keyword------------------------------------^ (before strtok)
你假设“的值keyWord
改变了”是错误的:关键字的值仍然是一样的,你可以用printf("value of keyWord: %p\n", keyWord);
检查它.改变的是 keyWord
指向 的值,也就是你在 printf.%s
中使用 %s
显示的内容。
这里的问题演示:http://goo.gl/71U1xA
我正在读取一个文件,在该文件中有一行:
SECTIE FIELD_IN #define ENDSEC
表示我需要将这一行之后的行存储到一个变量中,但是 仅 如果该行包含部分“#define
”。
所以,我遍历文件,当该行包含“SECTIE
”和“FIELD_IN
”时,它会检索其中包含 #
的单词并存储它在变量 keyWord
.
现在的问题是:keyWord
中的值在下一个循环中改变了,没有修改它。
我的文本文件是:
SECTIE FIELD_IN1 #define ENDSEC
#define COL1 1,1
#define COL2 2,3
#define COL3 5,3
...etc
我的代码输出是这样的:
START reading line text=SECTIE FIELD_IN1 #define ENDSEC keyword1=.. new sectie keyword2=.#define. reading line text=#define COL1 1,1 keyword1=. 1,1 . start = 1! keyword3=. 1,1 .
我的代码:
int x, status, start;
char inputLine[5000 + 1];
char copyLine[5000 + 1];
char *keyWord = "";
FILE *iFile;
status = NOERROR;
x = 0;
start = 0;
iFile = fopen(gsz_inputFile, "r");
if(iFile == NULL){
status = ER_OPEN;
return status;
}
while (fgets(inputLine, sizeof(inputLine), iFile) != NULL){
printf("\n\nreading line");
printf("\ntext=%s", inputLine);
printf("\nkeyword1=.%s.", keyWord);
strcpy(copyLine, inputLine);
strlwr(copyLine);
if(strstr(copyLine, "sectie") != NULL && strstr(copyLine, "field_in") != NULL){
start = 1;
printf("\nnew sectie");
//get keyword
keyWord = strtok(inputLine," ");
while (keyWord != NULL)
{
if(strstr(keyWord, "#") != NULL){
break;
}
keyWord = strtok(NULL, " ");
}
printf("\nkeyword2=.%s.", keyWord); //here the keyword is correct
continue;
}
if(start){
printf("\nstart = 1!");
printf("\nkeyword3=.%s.", keyWord);
//status = storeString(inputLine, keyw, x); //my actual code is different
if(status != NOERROR){ x--; }
x++;
}
}
我觉得跟while (fgets(inputLine, sizeof(inputLine), iFile) != NULL)
有关系,因为那行执行后,值变了
为什么进入下一个循环后keyWord
的值变了?我猜这与未定义的行为有关,但我不能指出这个问题。
strtok
修改输入缓冲区。所以你在循环结束时得到的 keyword
是一个指向 inputLine
中的位置的指针。当循环使用 fgets
读取另一行时,它会被覆盖。
你有 inputLine
这是一个数组。在其中存储 fgets()
:
while (fgets(inputLine, sizeof(inputLine), iFile) != NULL){
在你的循环中你说 keyWord
指向某个 inputLine 的标记(这意味着它指向你的数组中的某个地方)。
//get keyword
keyWord = strtok(inputLine," ");
当你 运行 第二个 fgets()
数组内容改变时,但它的地址没有改变,所以 keyWord 仍然指向 inputLine 内容的已经改变
示例:
first fgets():
inputLine: ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
keyWord-->""
second strtok:
keyWord------------------------------------^
second fgets():
inputLine: ['T', 'h', 'i', 's', ' ', 'c', 'h', 'a', 'n', 'g', 'e']
keyword------------------------------------^ (before strtok)
你假设“的值keyWord
改变了”是错误的:关键字的值仍然是一样的,你可以用printf("value of keyWord: %p\n", keyWord);
检查它.改变的是 keyWord
指向 的值,也就是你在 printf.%s
中使用 %s
显示的内容。