从文件中读取字符串并将它们作为 C 中的整数存储在数组中
Reading in strings from a file and storing them in an array as an integer in C
我正在尝试读取一个包含几百个整数的文件,其中一些是正数,一些是负数,并将它们存储在一个数组中。不过,必须使用 strtok 将它们作为字符串读入。我一直遇到分段错误,我不确定为什么。计数是计算文件中总共有多少个整数。
/*Input file looks like this:
718321747 -1828022042
-1665405912 -175307986
-53757018 -1551069786 525902369
-1945908378 853648883
*/
int main(int argc, char* argv[])
{
char buffer[50];
char* token;
int count = 0;
int num = 0;
int arr[MAX_SIZE];
if (argc != 2)
{
printf("Invalid number of arguments\n");
return 0;
}
FILE* fptr = fopen(argv[1], "r");
//open file
if (fptr == NULL)
{
printf("Unable to open file\n");
return 0;
}
while(fgets(buffer, 50, fptr))
//to get the file line by line
{
token = strtok(buffer, "\n\t ");
//find first token
num = atoi(token);
//convert it to an int
arr[count] = num;
//store in array
count++;
while(token != NULL)
//get rest of tokens and convert to int
{
token = strtok(buffer, "\n\t ");
num = atoi(token);
arr[count] = num;
count++;
}
}
return 0;
}
您永远不会检查是否在字符串中找到了令牌,您必须在尝试调用 atoi()
之前检查 strtok()
是否 return NULL
。 =18=]
然后你一直扫描相同的字符串strtok()
每次迭代都传递字符串,这也是错误的,你应该在第一次之后传递NULL
。
我还建议使用 strtol()
而不是 atoi()
来检查转换是否成功。
检查这段代码,我修复了它
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1000 /* ? whatever value you think is good. */
int main(int argc, char* argv[])
{
char buffer[50];
int count = 0;
int arr[MAX_SIZE];
if (argc != 2)
{
printf("Invalid number of arguments\n");
return 0;
}
FILE* fptr = fopen(argv[1], "r");
//open file
if (fptr == NULL)
{
printf("Unable to open file\n");
return 0;
}
//to get the file line by line
while ((fgets(buffer, 50, fptr) != NULL) && (count < MAX_SIZE))
{
char *pointer;
char *token;
pointer = buffer;
while (((token = strtok(pointer, "\n\t ")) != NULL) && (count < MAX_SIZE))
{
char *endptr;
arr[count] = strtol(token, &endptr, 10);
printf("%d\n", arr[count]);
if (*endptr != '[=10=]')
printf("error: could not convert %s to integer\n", token);
else
count++;
pointer = NULL;
}
}
return 0;
}
我不确定它是否适合你,因为我没有看到你输入数据的结构,但我相信它不会导致分段错误。
我正在尝试读取一个包含几百个整数的文件,其中一些是正数,一些是负数,并将它们存储在一个数组中。不过,必须使用 strtok 将它们作为字符串读入。我一直遇到分段错误,我不确定为什么。计数是计算文件中总共有多少个整数。
/*Input file looks like this:
718321747 -1828022042
-1665405912 -175307986
-53757018 -1551069786 525902369
-1945908378 853648883
*/
int main(int argc, char* argv[])
{
char buffer[50];
char* token;
int count = 0;
int num = 0;
int arr[MAX_SIZE];
if (argc != 2)
{
printf("Invalid number of arguments\n");
return 0;
}
FILE* fptr = fopen(argv[1], "r");
//open file
if (fptr == NULL)
{
printf("Unable to open file\n");
return 0;
}
while(fgets(buffer, 50, fptr))
//to get the file line by line
{
token = strtok(buffer, "\n\t ");
//find first token
num = atoi(token);
//convert it to an int
arr[count] = num;
//store in array
count++;
while(token != NULL)
//get rest of tokens and convert to int
{
token = strtok(buffer, "\n\t ");
num = atoi(token);
arr[count] = num;
count++;
}
}
return 0;
}
您永远不会检查是否在字符串中找到了令牌,您必须在尝试调用 atoi()
之前检查 strtok()
是否 return NULL
。 =18=]
然后你一直扫描相同的字符串strtok()
每次迭代都传递字符串,这也是错误的,你应该在第一次之后传递NULL
。
我还建议使用 strtol()
而不是 atoi()
来检查转换是否成功。
检查这段代码,我修复了它
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1000 /* ? whatever value you think is good. */
int main(int argc, char* argv[])
{
char buffer[50];
int count = 0;
int arr[MAX_SIZE];
if (argc != 2)
{
printf("Invalid number of arguments\n");
return 0;
}
FILE* fptr = fopen(argv[1], "r");
//open file
if (fptr == NULL)
{
printf("Unable to open file\n");
return 0;
}
//to get the file line by line
while ((fgets(buffer, 50, fptr) != NULL) && (count < MAX_SIZE))
{
char *pointer;
char *token;
pointer = buffer;
while (((token = strtok(pointer, "\n\t ")) != NULL) && (count < MAX_SIZE))
{
char *endptr;
arr[count] = strtol(token, &endptr, 10);
printf("%d\n", arr[count]);
if (*endptr != '[=10=]')
printf("error: could not convert %s to integer\n", token);
else
count++;
pointer = NULL;
}
}
return 0;
}
我不确定它是否适合你,因为我没有看到你输入数据的结构,但我相信它不会导致分段错误。