[英]C program - Seg fault, cause of
當我輸入6(int)作為值時,運行此命令會給我一個段錯誤(gcc filename.c -lm)。 請幫助我解決這個問題。 預期的功能尚未實現,但是我需要知道為什么我已經陷入段錯誤。
謝謝!
#include<stdio.h>
#include<math.h>
int main (void)
{
int l = 5;
int n, i, tmp, index;
char * s[] = {"Sheldon", "Leonard", "Penny", "Raj", "Howard"};
scanf("%d", &n);
//Solve Sigma(Ai*2^(i-1)) = (n - k)/l
if (n/l <= 1)
printf("%s\n", s[n-1]);
else
{
tmp = n;
for (i = 1;;)
{
tmp = tmp - (l * pow(2,i-1));
if (tmp <= 5)
{
// printf("Breaking\n");
break;
}
++i;
}
printf("Last index = %d\n", i); // ***NOTE***
//Value lies in next array, therefore
++i;
index = tmp + pow(2, n-1);
printf("%d\n", index);
}
return 0;
}
當為n
和s[n-1]
輸入6時,您正在執行越界訪問:
printf("%s\n", s[n-1]);
因為數組中只有5個指針。 因此只有0-4是有效索引。
您使用的是pow功能,效率不高。
這是我在Python中的解決方案。
from math import ceil
names = ['Sheldon', 'Leonard', 'Penny', 'Rajesh', 'Howard']
n = int(raw_input())
i = 0
j = 1
k = len(names)
while i <= n:
i += k
k += k
j += j
print names[int(ceil((n - (i - k * 0.5)) / (j * 0.5)) - 1)]
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.