2013-01-23 24 views
1

我已經編寫了C程序來處理病例寄存器。我的程序運行良好。我用-Wall進行編譯。它沒有顯示出任何Warning.But的problem is,如果我想用如.test.sh | ./caseRegisterbash loop運行,輸出就像下面:如何避免c程序中的「分段錯誤」

:>>:1498.00 
:>>:1499.00 
:>>:1500.00 
:>>:1501.00 
:>>:1502.00 
:>>:1503.00 
:>>:1504.00 
:>>:1505.00 
:>>:1506.00 
:>>:1507.00 
:>>:1508.00 
:>>:1509.00 
:>>:1510.00 
:>>:1511.00 
:>>:1512.00 
:>>:1513.00 
:>>:1514.00 
:>>:1515.00 
:>>:1516.00 
:>>:1517.00 
:>>:1518.00 
Segmentation fault 

這test.sh是:

#/bin/sh 

i=1 
run=1 
for ((; ;)) 
do 
echo $i 
#echo $((i++)) 
done 

爲什麼我的代碼長時間顯示「分段錯誤」?請任何人向我解釋糾正它的原因和預防技巧。提前感謝你。

我的代碼是:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
struct prod_details 
{ 
    int no_prod; 
    double total; 
    double array[1024]; 
}pd; 

char *getinput(char *inp) 
{ 
    printf(":"); 
    gets(inp); 
    if(strlen(inp) > 11) 
    { 
     printf("Input is restricted to 10 character\n"); 
     getinput(inp); 
    } 
    return inp; 
} 

void print() 
{ 
    printf("Grant Total is : %.2f\n",pd.total); 
} 

int check(char *str) 
{ 
    int i,minusflag=0,plusflag=0,optrflag=0; 
    if(strlen(str) == 0) 
     return 0; 
    if(str[strlen(str) -1] == '+' || str[strlen(str) -1] == '-' || str[strlen(str) -1] == '*') 
    { 
     printf("last operator\n"); 
     return 1; 
    } 

    if(str[0] == '-') 
    { 
     i=1; 
     while(str[i] != '-') 
     { 
      if(str[i] == '\0') 
      { 
       minusflag=1; 
       break; 
      } 
      i++; 
     } 
     if(str[i] == '-') 
     { 
      minusflag=0; 
      return 1; 
     } 
    } 
    if(str[0] == '-') 

    { 
     i=1; 
     while(str[i] != '+') 

     { 
      if(str[i] == '\0') 
      { 
       minusflag=1; 
       break; 
      } 
      i++; 
     } 
     if(str[i] == '+') 
     { 
      minusflag=0; 
      return 1; 
     } 
    } 
    if(str[0] == '-' && minusflag == 1) 
     return 2; 
    if(str[0] == '+') 
    { 
     i=1; 
     while(str[i] != '+') 
     { 
      if(str[i] == '\0') 
      { 
       plusflag=1; 
       break; 
      } 
      i++; 
     } 
     if(str[i] == '+') 
     { 
      plusflag=0; 
      return 1; 
     } 
    } 
    if(str[0] == '+') 
    { 
     i=1; 
     while(str[i] != '-') 
     { 
      if(str[i] == '\0') 
      { 
       plusflag=1; 
       break; 
      } 
      i++; 
     } 
     if(str[i] == '-') 
     { 
      plusflag=0; 
      return 1; 
     } 
    } 
    if(str[0] == '+' && plusflag == 1) 
     return 2; 
    if(str[0] == '*') 
     return 1; 
    if((str[0] == '+' || str[0] == '-') && (str[1] == '+' || str[1] == '-' || str[1] == '*' || str[1] == '/' )) 
     return 1; 

    for(i=0;i<strlen(str);i++) 
    { 
     if(((str[i] >= '!' && str[i] <= '/') || (str[i] >= ':' && str[i] <= '~'))) 
     { 
      if(str[i] == '*' || str[i] == '+' || str[i] == '-' || str[i] == '/') 
      { 
       optrflag++; 
      } 
      else 
       return 1; 
     } 
    } 
    if(optrflag == 1) 
     return 3; 
    else if(optrflag > 1) 
     return 1; 
    return 2; 
} 

int expcalc(char *str) 
{ 
    char copy[10]; 
    char op; 
    char *temp; 
    char numb[10],numf[10]; 
    printf("Start of expcal\n"); 
    int i; 
    double result=0; 

    for(i=0;i<strlen(str);i++) 
    { 
     if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') 
     { 
      op = str[i]; 
     } 
    } 
    strcpy(copy,str); 
    i=0; 
    while(str[i] != op) 
    { 
     numf[i] = str[i]; 
     i++; 
    } 
    numf[i] ='\0'; 
    temp=strchr(copy,op); 
    i=1; 
    printf("\n"); 
    while(temp[i] != '\0') 
    { 
     numb[i-1] = temp[i]; 
     i++; 
    } 
    numb[i-1] = '\0'; 
    switch(op) 
    { 
     case '+': 
      result=atof(numf)+atof(numb); 
      break; 
     case '-': 
      result=atof(numf)-atof(numb); 
      break; 
     case '*': 
      result=atof(numf)*atof(numb); 
      break; 
     case '/': 
      result=atof(numf)/atof(numb); 
      break; 
     default: 
      break; 
    } 
    printf("%.2f\n",result); 
    if((pd.total+result) < 0) 
    { 
     printf("Couldn't calculate\n"); 
     return 0; 
    } 
    pd.array[pd.no_prod]=result; 
    pd.total=pd.total+result; 
    printf(">>:%.2f\n",pd.total); 
    pd.no_prod++; 
    return 0; 
} 

int calc(char *str) 
{ 
    if((pd.total+atof(str)) < 0) 
    { 
     printf("Coundn't Calculate\n"); 
     return 0; 
    } 
    pd.array[pd.no_prod]=atof(str); 
    pd.total=pd.total+pd.array[pd.no_prod]; 
    printf(">>:%.2f\n",pd.total); 
    pd.no_prod++; 
    return 0; 
} 
int call() 
{ 
    int chkflg; 
    char input[1024]; 
    getinput(input); 
    chkflg=check(input); 
    if(chkflg == 3) 
    { 
     expcalc(input); 
     call(); 
    } 
    else if(chkflg == 2) 
    { 
     calc(input); 
     call(); 
    } 
    else if(chkflg == 1) 
    { 
     printf("You have entered Wrogly!!!\n Please enter correctly\n"); 
     call(); 
    } 
    else 
    { 
     print(); 
     return 1; 
    } 
    return 0; 
} 

int main() 
{ 
    printf("..CASE RIGISTER..\n"); 
    call(); 
    return 0; 
} 
+0

您的代碼存在問題,很可能您使用的指針並不指向您期望的內容。使用調試器找出在哪裏以及爲什麼。 –

+5

我想我們需要看到C代碼才能回答這個問題。 – templatetypedef

+1

分段錯誤意味着您的程序訪問或執行了無效的內存。你有一個錯誤。看到一些代碼可能會幫助人們分析它,但首先你應該運行一個調試器,看看你是否可以自己找出它。 – DrC

回答

1

pd.array只有餘地1024個結果。在寫入之前,你必須檢查no_prod是否爲< 1024,否則你會在未分配的內存中寫入,這是給你一個分段錯誤的原因。一旦no_prod達到1024你必須中止程序(我假設你還沒有使用動態分配)。

雖然不是真的在檢查時寫1024,但是使用宏作爲數組大小(如果您還沒有使用宏,請不要擔心)。