C:strtok传递分段错误

我正在尝试逐行读取文件,并标记每行,这些行的字符串由空格和制表符分隔。但是,当我运行程序时,尝试打印令牌时出现Segmentation Fault错误。我不明白为什么会这样,因为我使用缓冲区作为字符串来标记和检查标记是否为空。下面是我的代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE_LENGTH 70

int main(void)
{
    FILE * testFile;
    char buf[MAX_LINE_LENGTH];
    testFile = fopen("test_file.txt","r");

    if (testFile == NULL)
    {
        printf("Cannot open test_file.txt.\n");
        exit(0);
    }

     while (fgets(buf,sizeof(buf),testFile) != NULL) {
        char *token = strtok(buf," \t"); 


        while (token != NULL) 
        {
            token = strtok(NULL," \t"); 

            if (token != NULL) {
             printf("%s\n",token);
            }
        }
    }

    exit(1);
}

下面是test_file.txt的内容:

String1 String2 String3
String4 String5 String6
String7 String8 String9
yy54928 回答:C:strtok传递分段错误

看起来像您在打印时没有检查令牌指针是否为NULL。

如果您需要打印所有令牌,则还需要在strtok系统调用后在while循环内打印while循环,此外还需要对令牌进行非NULL检查。

,

两个有用的提示-(1)启用编译器警告,例如gcc / clang最低为-Wall -Wextra -pedantic,VS最低为/W3(任何其他编译器将具有类似的选项),并且直到其在没有警告的情况下编译才接受代码; (2)#include <string.h>,其中定义了strtok

除了@dreamer指出的缺乏验证之外,您还必须对strtok使用隐式定义。您应该会收到这些警告。不要忽略任何警告,而要修复它,它通常会告诉您问题代码所在的确切行。

接下来,不要硬编码文件名。将文件名作为第一个参数传递给您的程序一样简单(或默认情况下从stdin读取)。您的第二个选择是将文件名作为程序的输入。

将它们放在一起,您可以做一些简单的事情,例如:

#include <stdio.h>
#include <string.h>

#define MAX_LINE_LENGTH 70
#define DELIM " \t\n"

int main (int argc,char **argv) {

    char buf[MAX_LINE_LENGTH];
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1],"r") : stdin;

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fgets (buf,sizeof buf,fp))
        for (char *p = strtok(buf,DELIM); p; p = strtok(NULL,DELIM))
            puts (p);

    if (fp != stdin)   /* close file if not stdin */
        fclose (fp);

    return 0;
}

注意:,您需要包括'\n'作为分隔符,以防止其他'\n'成为每行最后一个标记的一部分)

使用/输出示例

$ ./bin/strtokfile test_file.txt
String1
String2
String3
String4
String5
String6
String7
String8
String9

仔细研究一下,如果您有任何疑问,请告诉我。

本文链接:https://www.f2er.com/2988000.html

大家都在问