我正在製作一個記錄時間,用戶ID和體重的應用程序。我如何檢查傳遞的第一個令牌是否是整數?我以爲我會使用isdigit,但這隻適用於單個字符。如果第一個標記不是整數,我想輸出無效時間。我目前使用檢查傳遞的字符串是否是整數
sscanf(userInput, "%d %s %f", ×tamp, userID, &weight);
如果第一個記號不是整數(例如具有字母)我仍然得到了可變時間戳,,我不想一個數字。
int main()
{
char userInput[99];
int timestamp, timestampT = 0;
char userID[31];
userID[0] = 0;
float weight, weightT, day, rateW;
while(fgets(userInput, 99, stdin) != NULL){
sscanf(userInput, "%d %s %f", ×tamp, userID, &weight);
if(timestamp == 0){
printf("%s\n", "Invalid time");
}
else if(!isalpha(userID[0]) || userID[0]=='_' || userID[0] == 0){
printf("%s\n", "Illegal userID");
}
else if(weight < 30.0 || weight > 300.0){
printf("%s\n", "Illegal weight");
}
else if(timestampT > 0){
day = timestampT/86400;
rateW = (weightT -weight)/(day - timestamp/86400);
if(rateW > 10.0 || rateW < -10.0){
printf("%s\n", "Suspiciously large weight change");
}
}
else{
printf("%d %s %f \n", timestamp, userID, weight);
timestampT = timestamp;
timestamp = 0;
weightT = weight;
}
userID[0] = 0;
}
}
使用sscanf的結果構建另一個字符串,然後將原始字符與重建字符串進行比較。如果它們不同,那麼某些東西不能正確轉換。例如'foo = printf('%d%s,%f',the,values,here); if(!strcmp(foo,userinput)){ruh_roh(); }' –
首先使用['sscanf()'](http://en.cppreference.com/w/c/io/fscanf)的結果確定成功分析了多少個參數。 [注意**第六誡**](http://www.seebs.net/c/10com.html) – WhozCraig
您可以使用'isdigit'查找字符串中的所有字符作爲您的時間戳或使用'isalpha' ID。(更好的寫函數。)或者你可以在第一個'sscanf'中以字符串的形式讀取時間,然後在該字符串上運行'sscanf('...,「%d」,...)'。 –