将字符串(char)转换为数组(int)

将字符串(char)转换为数组(int),c,string,C,String,我有一个文件.txt,其中包含一些int变量。我需要将第三组数字转换为int数组,以便以我想要的方式操作数据: EX: file.txt ============ 111111 1001 20120131 30 122222 2002 20110230 25 133333 3003 20100325 12 144444 1001 20110526 18 155555 1001 20100524 25 166666 2002 20120312 30 177777 2003 20120428 28

我有一个
文件.txt
,其中包含一些int变量。我需要将第三组数字转换为int
数组
,以便以我想要的方式操作数据:

EX: file.txt
============

111111 1001 20120131 30
122222 2002 20110230 25
133333 3003 20100325 12
144444 1001 20110526 18
155555 1001 20100524 25
166666 2002 20120312 30
177777 2003 20120428 28
188888 3003 20111214 15
199999 3002 20101113 27
199999 1001 20101202 29
133333 1001 20120715 25
155555 1001 20100204 24
177777 3003 20110102 30    
我需要逐行读取文件,我选择了
fscanf
函数:

FILE *fp;

int n1, n2, n4;
char n3[9];
int array[9]

[...]

while (fscanf (fp, "%d %d %s %d", &n1, &n2, n3, &n4);
现在我有了字符串,如何将其转换为int数组? 我试过:

for (i = 0; i < strlen(n3); i++)
    array[i] = atoi(strlen[i])

你需要像这样的东西:

int array[HUGE];

for (int i = 0; i < HUGE && fscanf(fp, "%d %d %s %d", &n1, &n2, n3, &n4) == 4; ++i)
{
    array[i] = atoi(n3);
}
int数组[巨大];
对于(int i=0;i
基本问题是,如果您不知道文件有多少行,那么您就不知道收件人数组的大小。更安全的解决方案是使用带有
malloc
realloc
的动态数组


在这一点上,将字符串读入
char[9]
也是非常危险的:如果文件包含错误的数据,您的程序就会死机,甚至更糟。首先使用
fgets
将文件逐行读入字符串,然后分别对每一行进行标记和解析,例如使用
strtoul

将更安全。至少我理解你的问题,你真正关心的是第三列中的数字。假设是这样的话,我想我应该做一些更像这样的事情:

for (i=0; i<elements(array); i++)
    if (0 == fscanf(infile, "%*d %*d %d %*d", array+i))
        break;
for ( i = 0; i < 8; i++ ) {
    array[i] = n3[i] - '0';
}

for(i=0;i如果您真的希望第三个元素是一个整数,那么为什么不在调用fscanf时将其作为一个整数读入呢?也就是说,我认为以下内容大致可以满足您的要求:

#define MAX_VALUES 9

FILE *fp;

int n1, n2, n3, n4;
int array[MAX_VALUES]
int num_values;

while (fscanf (fp, "%d %d %d %d", &n1, &n2, &n3, &n4) && (num_values<MAX_VALUES))
    array[num_values++] = n3;
#定义最大值9
文件*fp;
int n1、n2、n3、n4;
整数数组[最大值]
int num_值;

而(fscanf(fp),%d%d%d“,&n1,&n2,&n3,&n4)和&(num_值如果希望每行有8个单位数的数组,则可以执行以下操作:

for (i=0; i<elements(array); i++)
    if (0 == fscanf(infile, "%*d %*d %d %*d", array+i))
        break;
for ( i = 0; i < 8; i++ ) {
    array[i] = n3[i] - '0';
}
(i=0;i<8;i++)的
{
数组[i]=n3[i]-'0';
}
但是,正如其他人所说,在n3[]和数组[]的长度上依赖文件的格式不是一个好主意,尽管我在用8替换strlen()时做了完全相同的操作

我可能会在每一行使用空格作为分隔符,然后对数据进行一些验证,以确保它是您所想的


另外,第三列看起来像一个日期,你确定要一个int数组吗?

strlen[i]
是什么意思?
strlen
是一个函数,而不是数组。strlen保留字符串n3的长度。值得注意的是,第三列中的“数字”看起来可能实际上是日期(格式为YYYYMMDD),不是数字。但我想如果您愿意,可以将它们作为int进行处理。(例如,如果您只想按日期排序,则将它们作为int进行处理是有意义的)警告:传递'atoi'的参数1会从整数生成指针,而不使用强制转换[默认情况下启用]/usr/include/stdlib.h:148:12:注意:应为“const char*”,但参数类型为“char”@l_core:我做了一些更改。我看得越多,就越不喜欢你的方法。请改用
fgets
strtoul
来代替。我应该把它改为“for”吗?在fscanf?@l_core中或在fscanf外:此
for
循环在其主体中包含scanf。这将读取整个文件(或数组中有空间容纳的行数),将第三列中的数字放入数组,并忽略每行上的其他三个数字。