c语言 指针数组作为函数参数问题

问题描述

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 failedn");
        exit(1);
    }

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

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

解决方案

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

解决方案二:

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

解决方案三:

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

解决方案四:

试试:


void init_rec(day_record (*arr)[],FILE *file)

解决方案五:

我给写了一份完整的:

/*
    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 Datet Locat Workern");
    for(i=0; i<c; i++){
        day_record &r = *rcd[i];
        printf("%dt %dt %st %st %sn", 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]=='' ||  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. %sn", __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("%dt %dt %st %st %sn", 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 #%dn", __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 failedn");
        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.

解决方案六:

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

时间: 2024-09-29 19:17:57

c语言 指针数组作为函数参数问题的相关文章

详解C++编程中用数组名作函数参数的方法_C 语言

C++数组的概念 概括地说:数组是有序数据的集合.要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标.数组名和下标惟一地标识一个数组中的一个元素. 数组是有类型属性的.同一数组中的每一个元素都必须属于同一数据类型.一个数组在内存中占一片连续的存储单元.如果有一个整型数组a,假设数组的起始地址为2000,则该数组在内存中的存储情况如图所示. 引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系.许多好的算法都与

C语言及程序设计提高例程-36 多维数组作函数参数

贺老师教学链接  C语言及程序设计提高 本课讲解 用多维数组名作函数参数 #include <stdio.h> int max_value(int array[][4]); int main( ) { int a[3][4]= {{11,32,45,67},{22,44,66,88},{15,72,43,37}}; printf("max value is %d\n", max_value(a)); return 0; } int max_value(int array[]

C语言中数组名作为参数实现函数传递

用数组名作函数参数与用数组元素作实参有几点不同. 1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的.因此,并不要求函数的形参也是下标变量.换句话说,对数组元素的处理是按普通变量对待的.用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明.当形参和实参二者不一致时,即会发生错误. 2) 在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元.在函

《C语言及程序设计》实践参考——二维数组当函数参数

返回:贺老师课程教学链接 [项目1-二维数组当函数参数]定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: int sum(int array[ ][4],int m,int n); //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. #include <stdio.h> int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和 int main() { int

C语言指针在这个函数里发生了怎样的变化?

问题描述 C语言指针在这个函数里发生了怎样的变化? 从键盘任意输入10个整数,用指针变量作函数参数编程计算最大值和最小值,并返回它们所在数组中的位置.函数原型如下所示: int FindMax(int num[], int n, int *pMaxPos);//函数返回最大值,pMaxPos返回最大值所在的下标 int FindMin(int num[], int n, int *pMinPos);//函数返回最小值,pMaxPos返回最小值所在的下标 程序运行结果示例: Input 10 nu

C++中的指针、数组指针与指针数组、函数指针与指针函数

C++中的指针.数组指针与指针数组.函数指针与指针函数 本文从初学者的角度,深入浅出地详解什么是指针.如何使用指针.如何定义指针.如何定义数组指针和函数指针,并给出对应的实例演示:接着,区别了数组指针与指针数组.函数指针与指针函数:最后,对最常混淆的引用传递.值传递和指针传递做了区处. C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力.指针可以用于数组.或作为函数的参数,用来访问内存和对内存的操作,指针的使用使得C++很高效,但是指针也非常危险,使用不当会带来比较

c语言指针数组 字符串-C语言指针数组查找问题

问题描述 C语言指针数组查找问题 #include#includevoid main(){ void input(char name[]int n); void sort(char *name[]int n); void print(char *name[]int n); void search(char *name[]int n); char *name[4]; int n=4; input(namen); sort(namen); print(namen); search(namen);}v

编程c语言-c语言三维数组做函数输入变量,函数的形参怎么写?

问题描述 c语言三维数组做函数输入变量,函数的形参怎么写? 比如uint8_t cube[5][5][5];要在函数内处理数组内的数据并能返回值,肯定是传入三维数组的地址.函数定义时形参不知道怎么写才行??void process(uint8_t ????); 解决方案 用uint8_t * cube就可以了. 解决方案二: 需要用指针不然改的都是形参的临时内容,或者直接操作全局变量 解决方案三: 其实传入一个地址指针就可以实现数据同步了.*(&cube) 解决方案四: C语言:变量和函数引用的

c语言 指针数组与scanf

问题描述 c语言 指针数组与scanf #include#include void get(char p[]){for (int i = 0; i < 3; i++)scanf_s(""%s""p+i10);}void exchange(char *p[]){char *temp;for (int i = 0; i < 2; i++)for (int j = i + 1; j < 3; j++){if ((strcmp(p[i] p[j]))>