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年をただ1つの数字として読んでいます。

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一部は1桁を読み取ります(ただし、ブランクもスキップします)。は%nC89にあり、スキャンが文字列内にある位置を報告します。コンバージョンとしてはカウントされません(したがって、1との比較)。

于 2012-12-08T16:51:37.060 に答える
1

Cの文字列はNULLで終了します。つまり、文字列を期待する関数へのポインタを指定すると、このメモリ位置から最初のNULLバイトまでのすべてが文字列の一部と見なされます。

そうは言っても、各キャラクターを別々に扱う必要があります。まず、文字が実際に数字であるかどうかを確認する必要があります。Jonathan Lefflerが提案しているように、C標準は、「0」..「9」が文字セット内の連続した範囲であることを保証します。

ISO / IEC 9899:2011§5.2.1文字セット:ソースと実行の両方の基本文字セットで、上記の10進数のリストの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 に答える