0

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

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 视为一个数字。

4

2 回答 2

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格式部分读取单个数字(但也跳过空格)。在%nC89 中,报告扫描在字符串中的位置;它不计为转换(因此与 1 进行比较)。

于 2012-12-08T16:51:37.060 回答
1

C 中的字符串以 NULL 结尾。这意味着,如果您将指针指向期望字符串的函数,则从该内存位置到第一个 NULL 字节的所有内容都被视为字符串的一部分。

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

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

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

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);
于 2012-12-08T16:50:21.240 回答