0

ファイルから読み取った特定の変数が整数でないかどうかを確認しようとしています。そうでない場合は、それらを無視してエラーメッセージの出力を続行します。そのため、変数が int であるかどうかを確認するために isdigit() を使用しており、ある意味で「逆方向」に機能し続けています。

int parseStudent(struct student *person, char *data){

char *ptr;
int temp;

int i = 0;

ptr = strtok(data, DELIM);

temp = atoi(ptr);

if(isdigit(temp)){printf("Invalid TERM integer!\n");}

//if(!isdigit(temp)){printf("Invalid TERM integer!\n");}


//person[i].term = temp;


ptr = strtok(NULL, DELIM);

person[i].id = atoi(ptr);


ptr = strtok(NULL, DELIM);

strcpy(person[i].lastname, ptr);


ptr = strtok(NULL, DELIM);

strcpy(person[i].firstname, ptr);


ptr = strtok(NULL, DELIM);

strcpy(person[i].subjectname, ptr);


ptr = strtok(NULL, DELIM);

person[i].catalog = atoi(ptr);


ptr = strtok(NULL, DELIM);

strcpy(person[i].section, ptr);

}

最初のチェックでわかるように、私の意図は、最初の一時 int (int を保持すると想定されているため、"1301" を実行します) が実際に整数であるかどうかを確認することです。コメントを外した行を使用すると、条件に失敗し、何も出力されません。コメント行を使用すると、エラー メッセージが出力されます。逆じゃないですか!? これらの int と文字列が実際に int と文字列であることを確認し、顔にエラーを報告するにはどうすればよいですか?

4

3 に答える 3

3

isdigit - ドキュメントを確認してください - 整数値の変数ではなく、文字変数で使用されることになっています。

見てみな:

char digit = '1';
char notDigit = 'a';
char notEvenCloseADigit = 1;
int digitIsDigit = isdigit(digit);
int notDigitIsDigit = isdigit(notDigit);
int notEvenCloseADigitIsDigit= isdigit(notEvenCloseADigit);
于 2013-03-05T18:11:42.743 に答える
3

isdigit文字分類関数に属します。したがって、この関数は によって返された値を文字として解釈しatoiます (ASCII などの文字セットを使用)。それはあなたが期待するものではありません。エラーを処理したい場合は、この回答を読むことができます。

于 2013-03-05T18:10:47.517 に答える
0

これは逆ではありません。isDigit は、「1301」を使用したと言った数字の場合、true を返します。したがって、コメントを外した行はtrueを返しています。ただし、後者は !true または false を取ります。

于 2013-03-05T18:11:39.747 に答える