我的程序 [C89] 中的指针错误



该程序的目的是运行用户指定的数据,所有数据都格式化为 hw-data-3.txt其中 3 可以从 1 到 100 变化。我需要遍历指定的文件并将花费的总 $ 相加。每行最多有 50 个字符,包括 以及每个文件最多 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]='';
            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]!='';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);
}

这一行是问题所在:

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

argv[?]不是整数。您必须使用 strtol() 系列函数之一将字符串转换为 int。

您的代码还有许多其他问题:

1)检查用户是否提供了足够的参数(因为您正在使用argv[])。

2) 检查 fopen() 的返回值。

3)while(!feof(fp))不太可能是你想要的。 feof()告诉您是否已读过文件末尾。 阅读:为什么"while (!feof (file))"总是错误的?.

4)缓冲区intbuff[]只能容纳四个整数,而您似乎存储了用户参数提供的整数。

argv[argc-2]是一个c字符串(char*的类型)。取消引用后,您将获得第一个字符。然后,您将 ASCII 值转换为 int - 这不会为您提供该字符的实际值(更不用说该参数的整个数值) - 而是在参数上使用 atoi 来获取真正的整数。

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 ;
};

相关内容

  • 没有找到相关文章

最新更新