當前位置:首頁 » 編程語言 » c語言遍歷函數的參數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言遍歷函數的參數

發布時間: 2022-03-04 22:44:56

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]!='';j++)//列印一個字元串中的所有字元值。
putchar(argv[i][j]);
putchar(' ');
}