我一直在嘗試使用sscanf()帶有前導零的字串(例如'03')掃描整數。
但是,它作業正常,但只到 '07'。從 '08' 開始,字串將被讀取為 0。
您將在下面找到我的代碼和輸出。謝謝您的幫助!
#include <stdio.h>
#include <stdlib.h>
int main() {
char string_six[3] = "06";
char string_seven[3] = "07";
char string_eight[3] = "08";
char string_nine[3] = "09";
int six = -1;
int seven = -1;
int eight = -1;
int nine = -1;
sscanf(string_six, "%i", &six);
sscanf(string_seven, "%i", &seven);
sscanf(string_eight, "%i", &eight);
sscanf(string_nine, "%i", &nine);
printf("Six: %i\n",six);
printf("Seven: %i\n",seven);
printf("Eight: %i\n",eight);
printf("Nine: %i\n",nine);
return 0;
}
輸出:
Six: 6
Seven: 7
Eight: 0
Nine: 0
uj5u.com熱心網友回復:
您需要使用轉換說明符%d而不是%i.
來自 C 標準(7.21.6.2 fscanf 函式)
d匹配可選帶符號的十進制整數,其格式與 strtol 函式的主題序列的預期格式相同, base 引數的值為 10。相應的引數應該是一個指向有符號整數的指標。
i匹配可選帶符號的整數,其格式與 strtol 函式的主題序列的預期格式相同, base 引數的值為 0。相應的引數應該是一個指向有符號整數的指標。
和(7.22.1.4 strtol、strtoll、strtoul 和 strtoull 函式)
3 如果 base 的值為零,則主題序列的預期形式是 6.4.4.1 中描述的整數常量,前面可選加號或減號,但不包括整數后綴。
最后(6.4.4.1 整數常量)
integer-constant:
decimal-constant integer-suffixopt
octal-constant integer-suffixopt
hexadecimal-constant integer-suffixopt
uj5u.com熱心網友回復:
"08"被解釋為八進制數 0,后跟一個不能作為八進制數一部分的字符。如果您改為這樣做:
int n;
char c;
sscanf("08", "%i%c", &n, &c);
您應該觀察到設定n為 0 和c'8'.
這種行為是設計使然:%i在輸入中接受十進制、八進制和十六進制數字,使用與 C 源代碼相同的語法(即,前導 '0' 表示八進制,前導 '0x' 或 '0X' 表示十六進制)。
如果不想接受八進制或十六進制數,可以%d改用;'d' 表示只接受十進制數字。同樣,%o只接受八進制數(但不需要'0'前綴)并且%x只接受十六進制數(但不需要'0x'或'0X'前綴)。沒有辦法sscanf接受十進制和0x-prefix hex 但也不能接受0-prefix octal。
但是,由于函式*scanf已按規定損壞并且根本不應該使用,因此您真正應該做的是使用strtol第三個引數 10。(請注意手冊頁中有關檢查無效輸入的部分strtol。)(有沒有辦法strtol接受十進制和0x-prefix hex 但也不接受0-prefix octal。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410350.html
標籤:
上一篇:如何在C編程中清除螢屏我是U使用devc但我嘗試的一切似乎都失敗了我已經包含了許多不同的庫
下一篇:訪問沖突寫入c中的二維陣列
