2016-08-03 71 views
0

如果輸入被賦予一個像344565786464675345這樣的大數字,我仍然得到輸出,因爲char的範圍是256,所以它應該不會超過這個數字,爲​​什麼char可以存儲這樣的大整數?C中的數據類型(字符)

int main() 
{ 
    char b[30]; 
    scanf("%s",b); 
    printf("\n%s",b); 
    return 0; 
} 
+3

您輸入了一個字符串,而不是字符 –

+1

不安全的代碼警報 –

+0

有一些建立了處理大數字的建立良好的庫(https://en.wikipedia.org/wiki/List_of_arbitrary-precision_arithmetic_software )。也許你想在重新發明輪子之前查看諸如GMP之類的東西。因爲在這個問題之後(你得到一個巨大的整數),你可能會發現自己問如何減去,加或乘... –

回答

1

你有什麼是30char陣列,而不是一個單一的char -

char b[30]; //b is an array of char 

所以b的大小是30*sizeof(char)。這意味着它可以容納30個字符(包括'\0')。你的輸入存儲在這個字符數組中(足以提供輸入),因此你可以得到正確的輸出。

+0

如果B是一個小於10^250的整數,我們可以把這個整數存儲爲char str [ 256] @ameyCU –

+1

@AryamanTodkar:取決於最小的值是什麼? – alk

+0

@AryamanTodkar可以在'char str [256]'中存儲高達'10^250'('251'數字)的數字。 – ameyCU

1
char b[30]; 

b是一個數組,最多可以存儲30個字符。

至於

scanf("%s",b); 

您輸入18個字符

344565786464675345 

空字符\0已追加到你,因爲%s符,這使得總共有19的輸入的內容響應字符。或者

b[18]='\0' // Remember the count starts from 0 

因此,您的數組中仍然有11個空閒字節,作爲字符是1個字節的b

請注意,如果您嘗試在數組中存儲字符串,則該數組將被終止,即您需要在字符數組末尾有一個\0,以便將該組視爲字符串。

因此,從技術上講,您可以使用char b[30]爲最多29個字符的字符串創建一個有效的字符串。

+0

如果B是一個小於10^250的整數,我們可以將這個整數存儲爲char str [256] @sjsam –

+1

@AlterMann:好注意,更改:) – sjsam

+1

您不在這裏存儲整數;你正在存儲一串字符。請注意,您可以將單個字符中從零到255的任何整數的精確表示以及兩個字符中範圍內的任何整數(0,65535)存儲在一起,依此類推。 – FredK

2

charchar s之間有一個區別,這就是你所擁有的。

一個數組能夠存儲多達29位數加上空終止符,但是您輸入的值是而不是存儲爲大整數。相反,它被存儲爲一個字符序列,其中每個字符表示一個單位:

Index of b[] 0 1 2 3 4 5 6 7 8 ... 
char value '3' '4' '4' '5' '6' '5' '7' '8' '6' ... 
num value  51 52 52 53 52 53 54 55 54 ... 

的所有字符都在可以由單一char來表示的範圍內的數值。

+0

如果B是小於10^250的整數我們可以存儲這個整數作爲字符str [256] @dasblinkenlight –

+0

@AryamanTodkar是的,即使我們使用'char's來表示它的十進制數字,我們可以將它存儲。 – dasblinkenlight

+0

謝謝我知道了@dasblinkenlight –