Ошибка указателя в моей программе [C89]

Цель этой программы — просмотреть указанные пользователем данные, все данные отформатированы как hw-data-3.txt, где 3 может варьироваться от 1 до 100. Мне нужно перебрать указанные файлы и подсчитать общую потраченную сумму. В строке может быть не более 50 символов, включая \n, а также не более 30 строк в файле. Я получаю ошибку сегментации, я почти уверен, что это проблема с указателем, но я не уверен, где она. Может ли кто-нибудь помочь мне найти его?

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    char buff[255];int spent[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},i,z,intbuff[]={0,0,0,0};
    for(i=*argv[argc-2];i>=*argv[(argc-1)];i++)
    {
            sprintf(buff,"hw-data-%d.txt",i);
            FILE *fp;fp=fopen(buff,"r");    /*Initializing and setting file pointer for unknown amount of files*/
            buff[0]='\0';
            while(!feof(fp))    /*while the end of file has not been reached for the stream continue doing these actions*/
            {
                fgets(&buff[0],50,fp); /*captures 1 line at a time from stream then advances the streams position*/
                for(z=0;buff[z]!='\0';z++){
                    if(buff[z]=='$')
                        break;  /*breaks loop at position in line where $ occurs*/}
                for (i=0;i<2;i++,z++){
                    if (buff[z]=='0'||buff[z]=='1'||buff[z]=='2'||buff[z]=='3'||buff[z]=='4'||buff[z]=='5'||buff[z]=='6'||buff[z]=='7'||buff[z]=='8'||buff[z]=='9')
                        intbuff[i]=buff[z];
                    else
                        break;}/* break statement is here to preserve number of integers after $, ie. $100 i=3 $33 i=2 $9 i=1 */
                for (;i>=0;--i)
                {
                    intbuff[3]+=buff[i];
                }               
                for(i=0;i<30;i++)
                {(spent[i]==0)?(spent[i]=intbuff[3]):(0);}/* If i in int array is 0 then replace 0 with the number captured.*/
            }
            fclose(fp);
    }
    return(0);
}

person v3nd3774    schedule 24.02.2014    source источник


Ответы (3)


Эта строка является проблемой:

for(i=*argv[argc-2];i>=*argv[(argc-1)];i++)

argv[?] не является целым числом. Вы должны преобразовать строку в int, используя один из strtol(). семейные функции.

Ваш код имеет много других проблем:

1) Убедитесь, что пользователь предоставил достаточно аргументов (поскольку вы используете argv[]).

2) Проверьте возвращаемое значение fopen().

3) while(!feof(fp)) вряд ли то, что вам нужно. feof() сообщает, прочитали ли вы конец файла. Прочтите: Почему «while ( !feof (file) )» всегда неверно?.

4) Буфер intbuff[] может содержать только четыре целых числа, тогда как вы, кажется, храните столько целых чисел, сколько предусмотрено пользовательскими аргументами.

person P.P    schedule 24.02.2014

argv[argc-2] — это c-строка (тип char*). После разыменования вы получите первый символ. Затем вы преобразуете значение ASCII в int — это не даст вам фактического значения этого символа (не говоря уже о полном числовом значении этого аргумента) — вместо этого используйте atoi в аргументах, чтобы получить реальные целые числа.

person Leeor    schedule 24.02.2014

Делать while (!feof(fp)) — плохая практика.
Вы предполагаете, что fgets() работает успешно.

Попробуйте что-то вроде этого:

while (fgets(&buff[0],50,fp) != NULL)

Эта строка тоже не имеет особого смысла:

for(i=*argv[argc-2];i>=*argv[(argc-1)];i++)

Я бы попробовал настроить ваш код примерно так:

#include <stdio.h>
#include <stdlib.h>

#define LINE_LENGTH 50
#define MAX_LINES 30

int main (int argc, char *argv [])
{
    int i ;

    char buffer [LINE_LENGTH] = {0} ;

    // Assuming argv[0] is the program name.
    for (i = 1; i < argc; ++i) {
        FILE *fp ;
        fp = fopen (argv [i], "r") ;

        if (fp == NULL) {
            // Handle error...
        }

        while (fgets (buffer, LINE_LENGTH, fp) != NULL) {
            // ...
        }
    }

    return 0 ;
};
person jliv902    schedule 24.02.2014