㈠ c语言中如何获取函数可变参数的个数
这个看你是怎么调用的
一般都是约定个数 或者根据第一个参数,决定个数。
你这个写法,看起来是两个参数调用,然后都是char* 如果是这样
要改成
#include<stdio.h>
#include<stdarg.h>
voidprint(char*value,...)
{
char*t;
printf(value);
va_listval;
va_start(val,value);
t=va_arg(val,char*);//获取下一个参数需要赋值的。
printf(t);
va_end(val);
}
㈡ C语言中有没有这样的参数怎样才能遍历所有参数呢
可以参考命令行的main函数,里面的char *argv[],然后使用argv[x]数组就可以遍历了,不过里面的参数都属字符串。
㈢ C语言遍历所有文件的函数!
#include <stdio.h>
#include <dos.h>
#include <errno.h>
#include <io.h>
#include <dirent.h>
#include <dir.h>
#include <string.h>
#include <sys\stat.h>
#include "pm03a.h"
void main(int argc,char* argv[])
{
//printf("Number %d\n",ConfirmFileAttrib(argv[1]));
GetDirectory(argv[1]);
printf("\nSearch Over.\n");
}
//------------------------------------------------------------------
//pm03a.h
//------------------------------------------------------------------
void GetDirectory(char *DirectoryName);
int ConfirmFileAttrib(char* filename);
char *GetCurrentPath();
char* GetFullFileName(char *filename);
char *WillDeleteFile(char *FileName);
//--------------------------------------------------------
//--------------- 获得文件属性 ---------------------------
//--------------------------------------------------------
int ConfirmFileAttrib(char* filename)
{
int temp=0;
int attrib=(_rtl_chmod(filename,0));
if(attrib==-1)
{
switch(errno)
{
case ENOENT:
//printf("%s Path or file not found.\n",filename);
temp=0;
break;
case EACCES:
//printf("Permission denied.\n");
temp=-1;
break;
default:
//printf("Error number: %d", errno);
temp=-2;
break;
}
}
else
{
if(attrib & FA_RDONLY)
{
temp=1;
//printf("%s is read-only.\n", filename);
}
if(attrib & FA_HIDDEN)
{
temp=2;
//printf("%s is hidden.\n", filename);
}
if(attrib & FA_SYSTEM)
{
temp=3;
//printf("%s is a system file.\n", filename);
}
if(attrib & FA_DIREC)
{
temp=4;
//printf("%s is a directory.\n", filename);
}
if (attrib & FA_ARCH)
{
temp=5;
//printf("%s is an archive file.\n", filename);
}
}
return temp;
}
//--------------------------------------------------------
//--------------------------------------------------------
//--------------- 获取目录流 -----------------------------
//--------------------------------------------------------
void GetDirectory(char *DirectoryName)
{
DIR* Directory_Point;
struct dirent *entry;
bool DirControl;
if((Directory_Point=opendir(DirectoryName))==NULL)
{
printf("Error opening directory!\n");
return;
}
else
{
if(strcmp(DirectoryName,"..")==0)
{
return;
}
if(strcmp(DirectoryName,".")==0)
DirControl=true;
else
DirControl=false;
chdir(DirectoryName);
//char *filename=DirectoryName;
//int k=creat(strcat(filename,".txt"),S_IWRITE);
while(bool(entry=readdir(Directory_Point)))
{
if(ConfirmFileAttrib(entry->d_name)==5) // 确定为文件属性
{
// 文件过滤
WillDeleteFile(entry->d_name);
}
if(ConfirmFileAttrib(entry->d_name)==4) // 确定为目录属性
{
if(strcmpi(entry->d_name,"..")==0||strcmpi(entry->d_name,".")==0)
{
continue;
}
else
{
//printf("\n%s is direct\n\n",entry->d_name);
GetDirectory(entry->d_name);
}
}
}
if(!DirControl==true)
chdir("..");
closedir(Directory_Point);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
//---------- 判断文件类型以备过滤 ------------------------
//--------------------------------------------------------
char* GetFullFileName(char *filename)
{
char *FullFilename=GetCurrentPath();
if(strlen(FullFilename)<=3)
{
strcat(FullFilename,filename);
}
else
{
strcat(FullFilename,"\\");
strcat(FullFilename,filename);
}
return FullFilename;
}
char *GetCurrentPath()
{
char path[1024]="";
strcpy(path, "X:\\"); /* fill string with form of response: X:\ */
path[0] = 'A' + getdisk(); /* replace X with current drive letter */
getcurdir(0, path+3); /* fill rest of string with current directory */
return path;
}
char *WillDeleteFile(char *FileName)
{
int len;
for(len=strlen(FileName);len>=0;len--)
{
if(FileName[len]=='.')
break;
}
char* Retname;
int s=-1;
for(int i=len;i<=strlen(FileName);i++)
{
Retname[s+=1]=FileName[i];
}
int i=-1;
if(Retname[1]=='~')i=0;
if(strcmpi(Retname,".bak")==0)i=0;
if(strcmpi(Retname,".obj")==0)i=0;
if(strcmpi(Retname,".tds")==0)i=0;
if(strcmpi(Retname,".dcu")==0)i=0;
if(strcmpi(Retname,".tmp")==0)i=0;
if(strcmpi(Retname,".ilk")==0)i=0;
if(strcmpi(Retname,".pch")==0)i=0;
if(strcmpi(Retname,".pdb")==0)i=0;
if(strcmpi(Retname,".tlb")==0)i=0;
if(strcmpi(Retname,".idb")==0)i=0;
if(strcmpi(Retname,".pdb")==0)i=0;
if(strcmpi(Retname,".r$p")==0)i=0;
if(strcmpi(Retname,".OBR")==0)i=0;
if(strcmpi(Retname,".mbt")==0)i=0;
if(strcmpi(Retname,".mrt")==0)i=0;
if(strcmpi(Retname,".csm")==0)i=0;
if(i==0)
{
remove(GetFullFileName(FileName));
printf("%s delete\n",GetFullFileName(FileName));
}
return Retname;
}
㈣ C语言中用函数做函数的形式参数的问题
给你举个例子吧,这样就容易理解得多。
例子:设计一个函数func();在调用它时每次实现不同的函数功能,输入两个参数a和b,第一次调用func()时找出a和b中的较大者,第二次调用找出较小者,第三次调用求a和b之和。
说明:格式 (*p)() 表示定义一个指向函数的指针变量p,在c语言中这个格式是固定的,前面的()表示p先和*结合,是指针变量,后面的()表示p指向一个函数。前面的()不能省略,如果写成 *p(),由于()优先级比*高,那就表示p()函数返回的是一个指针,p本身就是函数不是指针了,意思完全变了。
任何一个函数,函数名就是该函数的入口地址(起始地址),也就是说函数名就是个地址,从这个地址开始,函数占用一段内存单元。因此可以用一个指针变量来指向这个这个函数名,这样就相当于指向这个函数了。所以下面的max,min,add函数都是一个地址,分别调用时就是赋值p=max,p=min,p=add,也就是(*p)(x,y)分别就等于max(x,y),min(x,y),add(x,y).
程序在win-tc和Dev-c++下调试通过。
#include <stdio.h>
#include <conio.h>
int max(int x,int y)
{
return(x>y?x:y);
}
int min(int x,int y)
{
return(x<y?x:y);
}
int add(int x,int y)
{
return(x+y);
}
int func(int x,int y,int (*p)()) /*定义指向函数的指针变量p,关键1*/
{int result;
result=(*p)(x,y); /*调用相应函数,函数名即地址给p,这样p指向该函数,关键2*/
printf("%d\n",result);
}
main()
{
int a,b;
printf("Please input two integers a and b:\n");
scanf("%d%d",&a,&b);
printf("max="); func(a,b,max);/*相当于赋值p=max*/
printf("min="); func(a,b,min);/*相当于赋值p=min*/
printf("add="); func(a,b,add);/*相当于赋值p=add*/
getch();
}
㈤ c语言 中序遍历线索2插树 要求写出定义 初始化 和遍历函数
#include <stdio.h>
#include <malloc.h>
typedef enum{Link,Thread} PointerTag; //指针标志
typedef int DataType;
typedef struct BiThreTree{ //定义结点元素
PointerTag LTag,RTag;
DataType data;
struct BiThreTree *lchild,*rchild;
}BiThreTree;
BiThreTree *pre; //全局变量,用于二叉树的线索化
BiThreTree *CreateTree() //按前序输入建立二叉树
{
BiThreTree *T;
DataType e;
scanf("%d",&e);
if(e==0)
T=NULL;
else
{T=(BiThreTree *)malloc(sizeof(BiThreTree));
T->data=e;
T->LTag=Link; //初始化时指针标志均为Link
T->RTag=Link;
T->lchild=CreateTree();
T->rchild=CreateTree();
}
return T;
}
void InThread(BiThreTree *T)
{
BiThreTree *p;
p=T;
if(p)
{
InThread(p->lchild);
if(!p->lchild)
{ p->LTag=Thread;
p->lchild=pre;
}
if(!pre->rchild)
{ pre->RTag=Thread;
pre->rchild=p;
}
pre=p;
InThread(p->rchild);
}
}
BiThreTree *InOrderThrTree(BiThreTree *T) //中序线索化二叉树
{
BiThreTree *Thre; //Thre为头结点的指针
Thre=(BiThreTree *)malloc(sizeof(BiThreTree));
Thre->lchild=T;
Thre->rchild=Thre;
pre=Thre;
InThread(T);
pre->RTag=Thread;
pre->rchild=Thre;
Thre->rchild=pre;
return Thre;
}
void InThrTravel(BiThreTree *Thre) //中序遍历二叉树
{
BiThreTree *p;
p=Thre->lchild;
while(p!=Thre) //指针回指向头结点时结束
{
while(p->LTag==Link)
p=p->lchild;
printf("%4d",p->data);
while(p->RTag==Thread&&p->rchild!=Thre)
{p=p->rchild;
printf("%4d",p->data);
}
p=p->rchild;
}
}
int main()
{
BiThreTree *T,*Thre;
T=CreateTree();
Thre=InOrderThrTree(T);
InThrTravel(Thre);
system("pause");
}
运行时,分别输入(前序输入):1 2 3 0 0 4 0 5 0 0 6 0 0
建立如下所示的二叉树:
1
2 6
3 4
5
中序遍历输出:3 2 4 5 1 6
㈥ C语言的遍历算法
思路1:
写出所有24种4个数的排列,存到一个数组里,假如数组是P[24][4];
那么可以
for
(i
=
0;
i
<
24;
i++)
for
(j
=
0;
j
<
24;
j++)
for
(k
=
0;
k
<
24;
k++)
三层循环,P[i],P[j],P[k]分别是矩阵的三个列
思路2:
利用dfs递归枚举
int
used[3][4];/*这个数组存放三个列中0~3这四个数是否已在这一列中出现过,需要提前清零*/
int
mat[3][4];/*要枚举的矩阵*/
void
dfs(int
col,
int
row)/*col表示现在已经搜索到哪一列(从0开始编号),row表示这一列已经填了几行*/
{
int
i;
if
(col
==
2
&&
row
==
4)
{
....../*运行到这里的时候,mat就是枚举到的一个矩阵*/
return;
}
if
(row
==
4)
{row
=
0;
col++;}
for
(i
=
0;
i
<
4;
i++)
if
(!used[col][i])
{
used[col][i]
=
1;
mat[col][row]
=
i;
dfs(col,
row
+
1);
used[col][i]
=
0;
}
return;
}
调用的时候调用dfs(0,0)
㈦ c语言如何用函数指针利用循环结构遍历多个函数
#include <stdio.h>
#define TYPE int
// 下面是加减乘除 4 个函数
TYPE add(TYPE a, TYPE b){return a+b;}
TYPE sub(TYPE a, TYPE b){return a-b;}
TYPE muti(TYPE a, TYPE b){return a*b;}
TYPE div(TYPE a, TYPE b){return a/b;}
int main(int argc, char *argv[])
{
// 函数指针数组,一共有 4 四个元素,分别是:
// 加减乘除 4 个函数的函数指针
// 你可以自己再添加其他函数,而不用修改代码。
TYPE (*functions[])(TYPE, TYPE) = {add,sub,muti,div};
// 函数指针数组中的元素个数,这里是 4 个。
unsigned int n = sizeof(functions)/sizeof(functions[0]);
// 要进行运算的数字
TYPE a = 10, b = 5 , result;
int i=0;
for(i=0; i<n; i++)
{// 调用函数指针数组里面的所有函数。
result = functions[i](a,b);
printf("%d\n", result);
}
return 0;
}
㈧ C语言for循环遍历argv中的字符串,一个一个字符打印
标准的main函数格式为:
int main(int argc, const char * argv[]);
用于存储命令行参数的argv是一组字符串,字符串的个数为argc的值。
所以要打印argv中的值,一般使用如下程序:
inti;
for(i=0;i<argc;i++)
printf("%s ",argv[i]);
这时一个个字符串打印的。没有必要要一个个字符打印。
如果要一个个字符打印,可以使用双重循环:
inti,j;
for(i=0;i<argc;i++)
{
for(j=0;argv[i][j]!='