我试图用fgets在C中读取基本文件。它应该读取一行,将其传递给tokeniser函数,该函数应该在每个' '上将其拆分,并将其添加到链接列表中。目前,它正在进入一个永无止境的循环,我不知道为什么。任何帮助都是非常感谢的。我真的很纠结于这个C语言
#define INPUTSIZE 11
void tokeniseString(LinkedList *list, char *str)
{
char *token = strtok(str, " ");
while (token != NULL)
{
insertLast(list, *token);
}
}
void readInputFile(char *fileName, LinkedList *list)
{
FILE* inputFile = fopen(fileName, "r");
char str[INPUTSIZE];
printf("1");
if (inputFile == NULL)
{
perror("Could not open file");
}
else
{
while (fgets(str, INPUTSIZE, inputFile) != NULL)
{
tokeniseString(list, str);
}
if (ferror(inputFile))
{
perror("Error while reading from file");
}
}
}发布于 2022-04-18 08:26:43
您有一个没完没了的循环,因为您没有扫描循环主体中的下一个令牌。你应该写:
void tokeniseString(LinkedList *list, char *str) {
char *token = strtok(str, " ");
while (token != NULL) {
insertLast(list, *token);
token = strtok(NULL, " ");
}
}但是,不能将令牌的第一个字节的值插入到列表中。您可能应该使用strtol()将令牌转换为数字:
#include <errno.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
void tokeniseString(LinkedList *list, char *str) {
char *token = strtok(str, " \t\r\n");
while (token != NULL) {
char *p;
long value;
errno = 0;
value = strtol(token, &p, 10);
if (p == token || *p != '\0') {
fprintf(stderr, "token is not a number: %s\n", token);
} else
if (errno != 0 || value > INT_MAX || value < INT_MIN) {
fprintf(stderr, "number is out of range: %s\n", token);
} else {
insertLast(list, (int)value);
}
token = strtok(NULL, " \t\r\n");
}
}请注意,修改字符串参数被认为是错误的做法,特别是使用对静态状态(如strtok() )有副作用的函数。以下是另一个不修改参数的版本:
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void tokeniseString(LinkedList *list, const char *str) {
for (;;) {
char *p;
long value;
int len;
/* skip whitespace */
str += strspn(str, " \t\r\n");
if (*str == '\0')
break;
/* get the length of the token */
len = strcspn(str, " \t\r\n");
errno = 0;
value = strtol(token, &p, 10);
if (p == str) {
fprintf(stderr, "token is not a number: %.*s\n", len, str);
} else
if (p != str + len) {
fprintf(stderr, "token has extra characters: %.*s\n", len, str);
} else
if (errno != 0 || value > INT_MAX || value < INT_MIN) {
fprintf(stderr, "number is out of range: %.*s\n", len, str);
} else {
insertLast(list, (int)value);
}
str += len;
}
}还请注意,您必须关闭readInputFile()中的文件。
https://stackoverflow.com/questions/71909291
复制相似问题