我有一个文本文件,内容如下:
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);
}
然而,程序段错误但编译。我将如何更有效地执行此操作(通过不出现段错误的方法)?
最佳答案
你有几个问题
您不检查文件是否打开。
在
fopen()
之后你必须确保你可以从文件中读取,如果fopen()
失败,它返回NULL
这么简单if (file == NULL) return -1;
将防止程序的其余部分出现问题。
您的
while
循环只包含一个语句,因为它缺少大括号。没有大括号你的 while 循环等同于
while (fgets(buf, sizeof(buf), file)) { ptr = strtok(buf, "f"); }
您没有检查
strtok()
是否返回了一个非NULL
值。如果在字符串中找不到标记,
strtok()
返回NULL
,您将返回的指针传递给atol
无论如何。这会导致未定义的行为,并且可能会导致段错误。
您不检查是否有参数传递给程序,但您仍然尝试将它与字符串进行比较。还有潜在的未定义行为。
我不知道下面的程序是否会做你需要的,因为它是你自己的程序,我只是让它更安全,避免了未定义的行为
#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/