gpt4 book ai didi

c - 文本文件上的Strtok导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:10:24 25 4
gpt4 key购买 nike

我有一个文本文件,内容如下:

5f6
2f6
4f6

我想从该文本文件中获取数字(作为字符,然后使用 atol()

将它们转换为整数)

我有代码:

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

int main(int argc, char * argv[])
{
initscr();
cbreak();
noecho();

char buf[100];
char * ptr;
char * ptr2;
char * ptr3;
char * ptr4;
int a;
int b;
int c;
int d;

FILE* file;
if (strcmp(argv[1],"test.txt") == 0)
{
file = fopen("test.txt","r");

while (fgets(buf,100,file) )

ptr = strtok(str,"f");
ptr2 = strtok(NULL," ");
ptr3 = strtok(NULL,"f");
ptr4 = strtok(NULL," ");
a = atol(ptr);
b = atol(ptr2);
c = atol(ptr3);
d = atol(ptr4);
}

refresh();
getchar();
endwin();
return (0);
}

然而,程序段错误但编译。我将如何更有效地执行此操作(通过不出现段错误的方法)?

最佳答案

你有几个问题

  1. 您不检查文件是否打开。

    • fopen()之后你必须确保你可以从文件中读取,如果fopen()失败,它返回NULL 这么简单

      if (file == NULL)
      return -1;

    将防止程序的其余部分出现问题。

  2. 您的 while 循环只包含一个语句,因为它缺少大括号。

    • 没有大括号你的 while 循环等同于

      while (fgets(buf, sizeof(buf), file))
      {
      ptr = strtok(buf, "f");
      }
  3. 您没有检查 strtok() 是否返回了一个非 NULL 值。

    • 如果在字符串中找不到标记,strtok() 返回NULL,您将返回的指针传递给atol 无论如何。

      这会导致未定义的行为,并且可能会导致段错误。

  4. 您不检查是否有参数传递给程序,但您仍然尝试将它与字符串进行比较。还有潜在的未定义行为。

我不知道下面的程序是否会做你需要的,因为它是你自己的程序,我只是让它更安全,避免了未定义的行为

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

int main(int argc, char * argv[])
{
char buf[100];
char *ptr;
char *ptr2;
char *ptr3;
char *ptr4;
int a;
int b;
int c;
int d;
FILE *file;

initscr();
cbreak();
noecho();

if (argc > 1)
{
file = fopen(argv[1], "r");
if (file == NULL)
return -1;
while (fgets(buf,100,file) != NULL)
{
ptr = strtok(str,"f");
ptr2 = strtok(NULL," ");
ptr3 = strtok(NULL,"f");
ptr4 = strtok(NULL," ");
if (ptr != NULL)
a = atoi(ptr);
if (ptr2 != NULL)
b = atoi(ptr2);
if (ptr3 != NULL)
c = atoi(ptr3);
if (ptr4 != NULL)
d = atoi(ptr4);
}
}
refresh();
getchar();
endwin();

return 0;
}

关于c - 文本文件上的Strtok导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28910852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com