我正在编写一个包含以下循环的函数。此段从包含多行文本的文本文件中读取,每行包含一个单词和\ r \ n个字符。
int strSize = 100;
char* sPtr = (char*)malloc(strSize*sizeof(char));
char* tPtr = (char*)malloc(strSize*sizeof(char));
FILE* fp = fopen("someTextFile.txt","r");
fgets(sPtr, strSize, fp); //Read in first line
while(sPtr != NULL) {
tPtr = strtok(sPtr, "\r\n"); //There's one word per line, which terminates with \r\n
if( strlen(tPtr) > 0)
{
... Do stuff
}
sPtr = fgets(sPtr, strSize, fp); //Read next line, if fgets() reaches EOF, then sPtr <= NULL
}
有问题的一行是:if( strlen(tPtr) > 0)
。如果tPtr为NULL,则该行导致seg。错误(奇怪地调用strlen(tPtr)
不会产生seg错误)。
无论如何,我认为这不会是一个问题,因为在while循环开始时会为NULL-case检查sPtr。显然,在strtok(sPtr, "\r\n")
对sPtr进行操作后,对于某些非NULL sPtr,您将获得NULL。但我不知道这是怎么发生的。
答案 0 :(得分:0)
这是正常行为。访问NULL指针正式 undefined behvaior ,这意味着任何事情都可能发生。分段错误只是那些可能的未定义行为之一。
如果找不到您正在搜索的令牌,strtok
也会返回NULL指针,这就是您在代码中检查NULL后继续获得段错误的原因。 See the documentation.