我知道我可以很容易地在互聯網上找到該函式的代碼頁,但我想知道為什么在傳遞10位陣列后,預期的結果并不像之前的那樣。
#include <stdio.h>
int xstraylen(char *arr) {
int len;
for (len = 0; *(arr len) != ''/span>; len ) {
//printf("%c", *(arr len));.
}
return len;
}
int str_into_int(char *str) {
int power = 10, len, number;
long int value = 0;
len = xstraylen(str);
printf("
%d
", len)。)
for (int index = 0; index < len; index ) {
number = (int)(*(str index) - 48)。
value = number;
value *= power。
printf("-%d- %d", index, number, value)。
}
value /= power。
return值。
}
int main() {
char *str = "1234567890"/span>;
int value。
value = str_into_int(str);
printf("
%d", value)。)
return 0;
輸出
10
-0- 1 10 -1- 2 120 -2- 3 1230 -3- 4 12340 -4- 5 123450 -5- 6 1234560 -6- 7 12345670 -7- 8 123456780 -8- 9 1234567890 -9- 0 -539222988
-53922298
uj5u.com熱心網友回復:
你的代碼對10位數的數字不起作用,因為你總是在添加數字后的回圈中把value乘以10,然后在最后除以。對于一個10位數的數字,最后的乘法在你的平臺上會導致算術溢位,因為int和long都可能有32位。
你應該在添加數字之前乘以value,并洗掉最后的除法:
int str_into_int(char *str) {
int power = 10, len, number;
long int value = 0;
len = xstraylen(str);
printf("
%d
", len)。)
for (int index = 0; index < len; index ) {
值 *= 功率。
number = (int)(*(str index) - 48) 。
value = number;
printf("-%d- %d %ld", index, number, value) 。
}
return value。
}
注意,該代碼可以進一步簡化和修改,以處理更大的值并檢測溢位:
unsigned long long int str_into_int(const char *str)/span> {
unsigned long long int value = 0;
for (int i = 0; str[i] >= '0' && str[i] <= '9'; i ) {
unsigned int digit = str[i] - '0'/span>;
if (value > ULLONG_MAX / 10 ||
(value == ULLONG_MAX / 10 && digit > ULLONG_MAX % 10) {
printf("conversion exceeds range of unsigned long long
")。)
return ULLONG_MAX。
}
value = value * 10 digit;
}
return value。
}
void test(const char *str) {
printf("%s -> %llu
", str, str_into_int(str))。
}
int main() {
test("1234567890");
test("12345678901234567890");
test("18446744073709551615");
test("18446744073709551616");
test("123456789012345678901234567890");
return 0。
輸出:
1234567890 -> 1234567890
12345678901234567890 -> 12345678901234567890
18446744073709551615 -> 18446744073709551615
轉換超過了無符號長條的范圍
18446744073709551616 -> 18446744073709551615
轉換超過了無符號長的范圍 long
123456789012345678901234567890 -> 18446744073709551615
uj5u.com熱心網友回復:
你的編譯器認為型別long int與型別int具有相同的取值范圍。
在這個運算式陳述句中
value *= power。
當value等于1234567890時發生溢位。
改變for回圈的邏輯,方法如下
for (int index = 0; index < len; index ) {
值 *= 功率。
number = *(str index) - '0';
value = number;
printf("-%d- %d %ld", index, number, value) 。
}
并洗掉此陳述句
value /= power;
記住,你的函式不處理符號標記。
考慮到函式xstraylen應以下列方式宣告
size_t xstraylen( const char *arr ) {
size_t len = 0;
while ( *( arr len ) ) len。
return len。
uj5u.com熱心網友回復:
我將使用Horner規則來計算一個整數的值,像這樣。
#include <stdio.h>/span>
int main(void)
{
char *ns="328327", *p=ns;
int valn = 0;
while(*p) valn=valn*10 (*p -'0'/span>)。
printf("%d
", valn)。)
return 0。
}
根據你想做的事情,你必須注意和檢查不要產生溢位,輸入要正確,等等。 但是對于你的問題,這是我能想到的最簡單的想法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/322483.html
標籤:
