从字符串中读取一位数整数

时间:2012-12-08 16:40:38

标签: c

我想从这样的文件中读取整数:

9 5  1847
6    9 5
 87     
2   48  1
7 1 5 4 2
6  17   8
   95  
4 6    8 
5192  7 4

例如,1,8,4,7将被视为不同的数字。

我试过这种方式:

 #define MAXLINE 1024

 void readFile(FILE *file){
     char line [MAXLINE];
     int j;
     while(fgets(line,MAXLINE,file)!=NULL){
         for(j=0;j<9;j++){              
             int a = atoi(&line[j]);
             printf("%d \n",a);         
         }      
     }
 }

但是它只读了一个数字1847。

2 个答案:

答案 0 :(得分:2)

enum { MAXLINE = 1024 };

void readFile(FILE *file)
{
    char line[MAXLINE];
    while (fgets(line, sizeof(line), file) != 0)
    {
        char *str = line;
        int j;
        int pos;
        while (sscanf(str, "%1d%n", &j, &pos) == 1)
        {
            printf("%d\n", j);
            str += pos;
        }
    }
}

格式的%1d部分读取一个数字(但也跳过空白)。 %n位于C89中,并报告扫描在字符串中的位置;它不算作转换(因此与1进行比较)。

答案 1 :(得分:1)

C中的字符串以NULL结尾。这意味着,如果你给一个期望字符串的函数指针,从这个内存位置到第一个空字节的所有内容都被认为是字符串的一部分。

话虽如此,你需要分别对待每个角色。首先,您需要检查字符是否实际上是一个数字。正如Jonathan Leffler所建议的那样,C标准保证'0'..'9'是charset中的连续范围:

  

ISO / IEC 9899:2011§5.2.1字符集:在源和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值应大于该值以前的。

因此,以下是正确的解决方案:

for (j = 0; j < 9; j++) {
   char c = line[j];
   if ('0' <= c || c <= '9')
       printf("%d \n", c - '0');
}

而不是c - '0'你也可以使用atoi,但是你需要再次将你的char变成一个字符串(这需要进入if):

char[2] s = " "; // " " only serves as a placeholder.
s[0] = c;
int a = atoi(s);