2 reamte Reamte 于 2016.03.07 17:14 提问

c语言 指针数组作为函数参数问题
 #include<stdio.h>
#include<stdlib.h>



void init_rec(day_record *arr[],FILE *file)
{
    char temp[80];
    int index=0;
    while((fscanf(file,"%s",temp))!=EOF)
    {
        arr[index]=NULL;
        arr[index]=(day_record * )malloc(sizeof(day_record));
        if(arr[index]==NULL)
        {
            printf("结构地址分配错误\n");
            exit(1);
        }
        replace(',',' ',temp);
        inputrc(arr[index],temp);
        index++;
    }

}

在gcc中编译 总是提示错误发生在void init_rec(day_record arr[],FILE *file)这一行

*
错误内容是 pay.c:6: 错误:expected ‘)’ before ‘*’ token **

结构体是这么写的

 //每日记录临时存储结构
typedef struct day_record
{
    int worker_nu;
    char date[DATE_LEN];
    char * loca;
    int work_nu;
    char * worker[WORK_LEN];
} day_record;

调用是这样的

#include<stdio.h>
#include<stdlib.h>
#include"pay.h"
#include"pay.c"


int main()
{
    FILE * fp;
    day_record * record[31];
    fp = fopen("pay","r");
    if(fp==NULL)
    {
        printf("open failed\n");
        exit(1);
    }

    init_rec(record,fp);
    putdr(record[0]);
    fclose(fp);
    return 0;
} 

想不明白是怎么回事 求指教 谢谢大家

6个回答

dujie4752041
dujie4752041   2016.03.07 17:57
已采纳

我刚用 VC 编译一下是可以过的,并且能够运行。重新 REBUILID 一下吧

Reamte
Reamte 谢谢啊
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.03.07 17:21

day_record怎么定义的,是不是有多余的分号

Reamte
Reamte typedef struct day_record { int worker_nu; char date[DATE_LEN]; char * loca; int work_nu; char * worker[WORK_LEN]; } day_record; 结构体是着样
2 年多之前 回复
Reamte
Reamte typedef struct day_record { int worker_nu; char date[DATE_LEN]; char * loca; int work_nu; char * worker[WORK_LEN]; } day_record; 结构体是着样
2 年多之前 回复
guole19900628
guole19900628   2016.03.07 17:24

这个应该是语法的问题,自己检查下。

Reamte
Reamte 好的 我再仔细检查检查 谢谢
2 年多之前 回复
WinsenJiansbomber
WinsenJiansbomber   2016.03.07 17:27

试试:


void init_rec(day_record (*arr)[],FILE *file)
WinsenJiansbomber
WinsenJiansbomber 定义指向 day_record[] 的指针
2 年多之前 回复
Reamte
Reamte 这样类型就不对了,报错是类型不配陪 这样定义是什么意思?
2 年多之前 回复
WinsenJiansbomber
WinsenJiansbomber   2016.03.07 23:11

我给写了一份完整的:

/*
    Record test data:
    11,2006/1/27,M.,90001,Bobert
    4,2012/3/4,S.,90301,White M.
    2,2011/3/7,C.,3401,John Fanck
    6,2003/4/17,W.,21401,Lyn W.
*/

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

#define DATE_LEN    12
#define LOCA_LEN    256
#define WORKER_LEN  512
#define MAX_LOOP    1024
#define MAX_LINE    MAX_LOOP

typedef struct day_record
{
    int  worker_nu;
    char date[DATE_LEN];
    char loca[LOCA_LEN];
    int  work_nu;
    char worker[WORKER_LEN];
} day_record;

void putdr(day_record *rcd[], int c){
    int i;
    printf("No.\t Work No.\t Date\t Loca\t Worker\n");
    for(i=0; i<c; i++){
        day_record &r = *rcd[i];
        printf("%d\t %d\t %s\t %s\t %s\n", r.worker_nu, r.work_nu, r.date, r.loca, r.worker);
    }
}

void replace(char s, char d, char c[]){
    int i=0;
    while(1){
        if( c[i]==0 ) break;
        c[i++]==s? c[i-1]=d:0;
        if( i>MAX_LOOP ) break;
    }
}

void inputrc(day_record *rcd, char c[], char delima){
    int i=0,j=0,k[5],ld,ll,lw;
    while(1){
        if( c[i]=='\0' ||  c[i]=='\n' || i>MAX_LOOP ){ 
            // NULL terminate with gets()/fscanf, \n with fgets()
            c[i] = 0;
            k[j] = i;
            break;
        }else{
            c[i++]==delima? k[j++]=i,c[i-1]=0:0;
        }
    }
    day_record &r = *rcd;
    i = sscanf(c,"%d", &r.worker_nu);
    i+= sscanf(    (char*)&c[k[2]], "%d", &r.work_nu);
    ld = k[1]-k[0];
    ll = k[2]-k[1];
    lw = k[4]-k[3];

    if( !(i==2 && ld<DATE_LEN && ll<LOCA_LEN && lw<WORKER_LEN) ){
        printf("Data error! line #%d. %s\n", __LINE__, c);
        exit(__LINE__);
    }
    strncpy( r.date,   (char*)&c[k[0]], ld+1);
    strncpy( r.loca,   (char*)&c[k[1]], ll+1);
    strncpy( r.worker, (char*)&c[k[3]], lw+1); //plus NULL terminator
    //printf("%d\t %d\t %s\t %s\t %s\n", r.worker_nu, r.work_nu, r.date, r.loca, r.worker);
    //sscanf(c, "%d %s %s %d %s", &r.worker_nu, r.date, r.loca, &r.work_nu, r.worker);
}

int init_rec(day_record *rcd[],FILE *file)
{
    char temp[MAX_LINE];
    int index=0;
    while( fgets(temp,MAX_LINE,file)!=NULL) // don't fscanf(file,"%s",temp)!=EOF
    {
        rcd[index]=NULL;
        rcd[index]=(day_record * )malloc(sizeof(day_record));
        if(rcd[index]==NULL)
        {
            printf("failure of memory allocation. line #%d\n", __LINE__);
            exit(1);
        }
        //replace(',',' ',temp);
        inputrc(rcd[index],temp, ',');
        index++;
    }
    return index;
}


int main()
{
    FILE * fp;
    day_record * record[31];
    fp = fopen("pay.txt","r");
    if(fp==NULL)
    {
        printf("file pay.txt open failed\n");
        exit(1);
    }

    int c = init_rec(record,fp);
    putdr(record, c);
    fclose(fp);
    return 0;
} 

输出:

a.exe
No. Work No. Date Loca Worker
11 90001 2006/1/27 M. Bobert B.
4 90301 2012/3/4 S. White M.
2 3401 2011/3/7 C. John Fanck
6 21401 2003/4/17 W. Lyn W.

Reamte
Reamte 谢谢啊
2 年多之前 回复
John_ToStr
John_ToStr   Rxr 2016.03.08 16:37

这问题一般就是语法问题,主要是代码逻辑没问题就不是大问题

Reamte
Reamte 非常感谢
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言 指针和指针数组作main函数的形参
不带形参的main函数一般写成: int main() 或 int main(void) 表示mian函数没有参数,调用mian函数时不需要给出实参。而mian函数有形参的形式:int main( int argc, char** argv) int main( int argc, char *argv[]) 我是这样理解这两种方式,其中第一种方式 **argv是指针的指针,指针指向变量,指
C语言中指针数组作为参数传递修改内容
#include void change(char **strs){ strs[0] = "paaa"; strs[1] = "pbbb"; strs[2] = "cpcc"; strs[3] = "ddxd"; } int main() { char *strs[4]; int i; strs[0] = "aaa"; strs[1] = "bbb"; strs[2] =
指针数组&数组指针的分配内存及函数参数 C语言版
最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了。所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了《C缺陷和陷阱》也没有我想要的东西。要么就是C和C++混为一谈,new int[5]这种语法C肯定是错误的,所以找个机会总结一下,然后希望以后不要再栽在基础上。定义指针数组:int p[10] 数组指针 int(*p)[5]
数组和指针做函数参数传递
数组名和指向数组的指针做函数实参的传递,函数名,指针做函数形参。使用指针或下标法输出
C语言用指向数组的指针作函数参数小例子
有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数average求总平均成绩,用函数search找出并输出第i个学生的成绩。有些网上给出的方法有bug,这个是我自己修改过的程序。
二级指针、数组指针、二维数组、指针数组作为函数形参时可传入的实参
1、传参规则:a.当二级指针作为函数形参时,能作为函数实参的是二级指针,指针数组,一级指针的地址 b.当数组指针作为函数形参时,能作为函数实参的是二维数组,数组指针 c.当二维数组作为函数形参时,能作为函数实参的是二维数组,数组指针 d.当指针数组作为函数形参时,能作为函数实参的是指针数组,二级指针,一级指针的地址2、实例验证:#include <stdio.h> #include <stdl
指针数组作为函数参数的使用问题
 #include using namespace std;void fun(char** p, int num){   for (int i = 0; i    {      char* pTemp = p[i];      cout   }}void main(void){   char* aaa[] = {"a11", "b11", "c11"};    fun(aaa, 3);  
main函数参数的使用和指针数组的理解结合实例
1.使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。   例如:输入test.exe -a 1 2       执行1+2输出3 函数实现: #define _CRT_SECURE_NO_WARNINGS #include #include int
c语言指针、数组、函数做函数参数详解
用指针做参数 #include &amp;lt;stdio.h&amp;gt; void swap(int *a, int* b) { int t = *a; *a = *b; *b = t; } int main() { int a = 3, b = 4; swap(&amp;amp;a, &amp;amp;b); printf(&quot;%d %d&quot;, a, b); re...
指针作为函数参数(处理数组的四种方式)
//数组名传递给指针子参数 #include #define N 3 float average(float * g); int main() { float grade[N]={60,75,80}; printf("学生的平均成绩是:%.3f\n",average(grade)); } float average(float * g) { float *a=g; //这句话