当你不知道有多少个整数时,如何从char字符串中读取整数? (在C中)

时间:2013-12-17 13:59:30

标签: c scanf

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

static const char nameOfFile[] = "blablabla.txt";
char lineG [128];

static char * readLine()
{
    static FILE *file;
    if(file == NULL)
        file = fopen ( nameOfFile, "r" ); //opens the file

    if ( file != NULL )
    {
        if( fgets ( lineG, sizeof (lineG), file ) != NULL ) //reads a line from file
            return lineG;
        else
            fclose ( file );
    }

    else perror ( nameOfFile ); 
    return NULL;
}

int main (void)
{
    char *line, a;
    line=readLine();
    char c;
    int a[30],b[30];

    sscanf(line,"%c %d%d%d%d",&c,a[0],b[0],a[1],b[1]);

    return 0;
}

如你所见,我试图从文件中读取int字符串。但我不知道有多少int夫妇(如12,23;)会有。我正在寻找适合所有人的解决方案 txt文件将是这样的(两行或更多行)

A 12,54;34,65;54,56;98,90   
B 23,87;56,98

2 个答案:

答案 0 :(得分:1)

使用%n格式说明符并一次读取一个整数。相关的参数 %n填充了sscanf()读取的字符串的索引。 C99标准中格式说明符n的说明:

  

不消耗任何输入。 相应的参数应该是指针   有符号整数,用于写入从中读取的字符数   到目前为止,通过调用fscanf函数的输入流。执行一个   %n指令不会增加返回的赋值计数   完成fscanf函数的执行。没有参数被转换,   但是有一个被消耗了。如果转换规范包括赋值抑制   字符或字段宽度,行为未定义。

需要动态分配的数组(使用malloc())来存储int并根据需要进行扩展(使用realloc())。读取int(但不添加到数组)的简单示例:

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

int main()
{
    const char* in = "15 16 17 18";
    int i;
    int pos = 0;
    int total_pos = 0;

    while (1 == sscanf(in + total_pos, "%d%n", &i, &pos))
    {
        total_pos += pos;
        printf("i=%d\n", i);
    }

    return 0;
}

参见在线演示@ http://ideone.com/sWcgw0

答案 1 :(得分:1)

要读取X数字,您只需在循环中一次读取一个。这里的问题是,数字不是用空格分隔,而是用逗号和分号分隔。这不容易通过简单的sscanf处理。

相反,我建议您先在行中提取字母,然后使用strtok拆分分号上的剩余字符,然后再次使用strtok分隔逗号。然后,您可以使用strtol将字符串中的数字转换为整数值。