user-0 提问: 请教一个函数与指针的问题

回复:
user: user-0
content: 引用 17 楼 zhao4zhong1 的回复:void Get_Latest_File_Name(char **p,int len){     char capBuf[128] = {0};     FILE *fp;     sprintf(capBuf,"tail -n1 /home/lei/mnt/leileilei |awk '{print $2}'");     fp = popen(capBuf, "r");     fgets(*p, len, fp);     pclose(fp); } int main() {     char Buf[256];     char *pBuf=(char *)Buf;     Get_Latest_File_Name(&pBuf,256);     printf("%s\n",pBuf);     return 0; }   谢谢赵四老师，可以编过了也和我想要的结果一样。就是水平太低得消化消化。。再次谢谢

user: user-1
content: void Get_Latest_File_Name(char **p,int len){     char capBuf[128] = {0};     FILE *fp;     sprintf(capBuf,"tail -n1 /home/lei/mnt/leileilei |awk '{print $2}'");     fp = popen(capBuf, "r");     fgets(*p, len, fp);     pclose(fp); } int main() {     char Buf[256];     char *pBuf=(char *)Buf;     Get_Latest_File_Name(&pBuf,256);     printf("%s\n",pBuf);     return 0; }

user: user-2
content: 学到老活到老，学习到了

user: user-0
content: 引用 11 楼 paschen 的回复:那函数参数要用char**二级指针，如写成char**p  函数中加上 *p = tabBuf;  main中定义char* pBuf，并用&pBuf作为参数调用函数即可   char Get_Latest_File_Name(char **p){         char capBuf[128] = {0};         char tabBuf[128] = {0};         *p = tabBuf;         FILE *fp = NULL;         sprintf(capBuf,"tail -n1 /home/lei/mnt/leileilei |awk '{print $2}'");         fp = popen(capBuf, "r");         fgets(tabBuf, sizeof(tabBuf), fp);         pclose(fp);         //printf("%s\n",tabBuf); }  int main(){         char *pBuf;         char *result;         result = &pBuf;         printf("%s\n",result); }   请您看一眼是这样子吗

user: user-0
content: 引用 13 楼 cfjtaishan 的回复:[quote=引用 4 楼 m0_38117705 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:]  char* Get_Latest_File_Name() {     char capBuf[128] = {0};     static char tabBuf[128] = {0};     FILE *fp = NULL;     sprintf(capBuf,"tail -n1 %s | awk '{print $2}'" MD5FILE);     fp = popen(capBuf, "r");     while(fgets(tabBuf, 34, fp)!=NULL){     }     pclose(fp);     return tabBuf; } 加static是为了影响tabBuf的生命周期，因为加了static之后，tabBuf是静态数组，在数据段上申请空间（而不是在栈上），返回栈上的空间是未定义行为； 也可以定义成指针，但是必须在堆上申请空间，因为堆上的空间生命周期也是从申请开始知道释放结束；即调用malloc和free函数（C++中也可以用new/delete） 使用完之后需要free，在该函数外释放；一般很容易忘释放；  使用static和堆上申请空间两种方法都是可以实现你的需求；但是也是有区别的；  使用static也是我研究了好久的办法，但是给别人看别人讲使用static的话虽然能得到想要的结果，但是并不是特别好，建议指针传参什么的。您能给点建议吗[/quote] 如果这个缓存里的数据相一致保存，那么可以考虑定义全局数组；如果是缓存里的数据只是用一下，可以考虑malloc/free或new/delete 当然也是可以用参数传递的方法，即定义一个形参，指针形式。然后将数据保存到这个指针指向的缓存里。实参可以考虑用一个数组；[/quote]  我试了半天，在网上看的也都看不明白，能麻烦您帮我指出关键部分的代码吗，想要通过参数传递的方法拿到一个值，以用于在main中拼接成新的指令

user: user-3
content: 引用 4 楼 m0_38117705 的回复:[quote=引用 1 楼 cfjtaishan 的回复:]  char* Get_Latest_File_Name() {     char capBuf[128] = {0};     static char tabBuf[128] = {0};     FILE *fp = NULL;     sprintf(capBuf,"tail -n1 %s | awk '{print $2}'" MD5FILE);     fp = popen(capBuf, "r");     while(fgets(tabBuf, 34, fp)!=NULL){     }     pclose(fp);     return tabBuf; } 加static是为了影响tabBuf的生命周期，因为加了static之后，tabBuf是静态数组，在数据段上申请空间（而不是在栈上），返回栈上的空间是未定义行为； 也可以定义成指针，但是必须在堆上申请空间，因为堆上的空间生命周期也是从申请开始知道释放结束；即调用malloc和free函数（C++中也可以用new/delete） 使用完之后需要free，在该函数外释放；一般很容易忘释放；  使用static和堆上申请空间两种方法都是可以实现你的需求；但是也是有区别的；  使用static也是我研究了好久的办法，但是给别人看别人讲使用static的话虽然能得到想要的结果，但是并不是特别好，建议指针传参什么的。您能给点建议吗[/quote] 如果这个缓存里的数据相一致保存，那么可以考虑定义全局数组；如果是缓存里的数据只是用一下，可以考虑malloc/free或new/delete 当然也是可以用参数传递的方法，即定义一个形参，指针形式。然后将数据保存到这个指针指向的缓存里。实参可以考虑用一个数组；

user: user-0
content: 引用 20 楼 zhao4zhong1 的回复:fgets(*p, len, fp);if ('\n'==(*p)[strlen(*p)-1]) (*p)[strlen(*p)-1]=0; 添加红色语句，去掉行末的换行符。  赵四老师好厉害，谢谢您

user: user-1
content: fgets(*p, len, fp);if ('\n'==(*p)[strlen(*p)-1]) (*p)[strlen(*p)-1]=0; 添加红色语句，去掉行末的换行符。

user: user-0
content: 引用 17 楼 zhao4zhong1 的回复:void Get_Latest_File_Name(char **p,int len){     char capBuf[128] = {0};     FILE *fp;     sprintf(capBuf,"tail -n1 /home/lei/mnt/leileilei |awk '{print $2}'");     fp = popen(capBuf, "r");     fgets(*p, len, fp);     pclose(fp); } int main() {     char Buf[256];     char *pBuf=(char *)Buf;     Get_Latest_File_Name(&pBuf,256);     printf("%s\n",pBuf);     return 0; }        Get_Latest_File_Name(&Latest_File,7);     sprintf(import,"sed -i '/%s/d' %s ",Latest_File,MD5FILE);     printf("%s\n",import);  打印出的结果： sed -i '/1.sql /d' /home/lei/mnt/leileilei    赵四老师，现在又出个问题，如果把7的那个位置设置大了的话会出现多余的换行符，能请问一下怎么解决吗，因为获取到的结果有可能是5位也有可能是6位，所以会有一点小问题造成指令出错

user: user-4
content: 那函数参数要用char**二级指针，如写成char**p  函数中加上 *p = tabBuf;  main中定义char* pBuf，并用&pBuf作为参数调用函数即可

user: user-0
content: 引用 9 楼 paschen 的回复:你函数已经返回了一个指向这个静态数组变量的指针，直接使用这个指针就行  char* Get_Latest_File_Name(在这里设置一个指针什么的){  char capBuf[128] = {0}; static char tabBuf[128] = {0}  对现在是完全可以使用，这个函数可以按照预想的获取到一个字符串。然后在main函数中拼接成一个新的命令。就是教我的人项要我在上边我指出那个位置那里好像是要我做个指针然后在main函数中使用指针拼接。好像是这个意思，新手有好多不懂，解释的不好的地方见谅

user: user-4
content: 你函数已经返回了一个指向这个静态数组变量的指针，直接使用这个指针就行

user: user-0
content: 引用 6 楼 iloveyou418 的回复:函数传参。 比如   int  Cfu(char *a) { 对a赋值 } int  main（） ｛ char a[10]; Cfu（a）; ｝  这样子？  好像是，我研究研究，是个新手，对指针不大敏感。谢谢指教

user: user-0
content: 引用 5 楼 Intel0011 的回复:是这样吗  char tabBuf[128] = {0}; void Get_Latest_File_Name(char* p) {     char capBuf[128] = {0};     FILE *fp = NULL;     sprintf(capBuf,"tail -n1 %s | awk '{print $2}'" MD5FILE);     fp = popen(capBuf, "r");     while(fgets(p, 34, fp)!=NULL){     }     pclose(fp); } Get_Latest_File_Name(tabBuf); //结果在tabBuf中   是是是，应该是这个样子。我调试一下每天给别人看看，万分感谢

user: user-5
content: 函数传参。 比如   int  Cfu(char *a) { 对a赋值 } int  main（） ｛ char a[10]; Cfu（a）; ｝  这样子？

user: user-6
content: 是这样吗  char tabBuf[128] = {0}; void Get_Latest_File_Name(char* p) {     char capBuf[128] = {0};     FILE *fp = NULL;     sprintf(capBuf,"tail -n1 %s | awk '{print $2}'" MD5FILE);     fp = popen(capBuf, "r");     while(fgets(p, 34, fp)!=NULL){     }     pclose(fp); } Get_Latest_File_Name(tabBuf); //结果在tabBuf中

user: user-0
content: 引用 1 楼 cfjtaishan 的回复: char* Get_Latest_File_Name() {     char capBuf[128] = {0};     static char tabBuf[128] = {0};     FILE *fp = NULL;     sprintf(capBuf,"tail -n1 %s | awk '{print $2}'" MD5FILE);     fp = popen(capBuf, "r");     while(fgets(tabBuf, 34, fp)!=NULL){     }     pclose(fp);     return tabBuf; } 加static是为了影响tabBuf的生命周期，因为加了static之后，tabBuf是静态数组，在数据段上申请空间（而不是在栈上），返回栈上的空间是未定义行为； 也可以定义成指针，但是必须在堆上申请空间，因为堆上的空间生命周期也是从申请开始知道释放结束；即调用malloc和free函数（C++中也可以用new/delete） 使用完之后需要free，在该函数外释放；一般很容易忘释放；  使用static和堆上申请空间两种方法都是可以实现你的需求；但是也是有区别的；  使用static也是我研究了好久的办法，但是给别人看别人讲使用static的话虽然能得到想要的结果，但是并不是特别好，建议指针传参什么的。您能给点建议吗

user: user-0
content: 引用 2 楼 user-7 的回复:char* Get_Latest_File_Name() { 	char capBuf[128] = { 0 }; 	char *tabBuf = new char[128]; 	FILE *fp = NULL; 	sprintf(capBuf, "tail -n1 %s |awk '{print $2}'" MD5FILE); 	fp = popen(capBuf, "r"); 	while (fgets(tabBuf, 34, fp) != NULL) { 	} 	pclose(fp); 	return tabBuf; } 改成这样就OK了，记得用完delete这个内存 引用 2 楼 user-7 的回复:char* Get_Latest_File_Name() { 	char capBuf[128] = { 0 }; 	char *tabBuf = new char[128]; 	FILE *fp = NULL; 	sprintf(capBuf, "tail -n1 %s |awk '{print $2}'" MD5FILE); 	fp = popen(capBuf, "r"); 	while (fgets(tabBuf, 34, fp) != NULL) { 	} 	pclose(fp); 	return tabBuf; } 改成这样就OK了，记得用完delete这个内存  delete内存是怎么操作呀，是pclose吗还是有其他的神奇操作。 我这个也是奉命行事，别人告诉我用static写虽然可以得到想要的结果，但是不属于主流写法，建议用指针实现，您能给点建议吗

user: user-7
content: char* Get_Latest_File_Name() { 	char capBuf[128] = { 0 }; 	char *tabBuf = new char[128]; 	FILE *fp = NULL; 	sprintf(capBuf, "tail -n1 %s |awk '{print $2}'" MD5FILE); 	fp = popen(capBuf, "r"); 	while (fgets(tabBuf, 34, fp) != NULL) { 	} 	pclose(fp); 	return tabBuf; } 改成这样就OK了，记得用完delete这个内存

user: user-3
content: char* Get_Latest_File_Name() {     char capBuf[128] = {0};     static char tabBuf[128] = {0};     FILE *fp = NULL;     sprintf(capBuf,"tail -n1 %s | awk '{print $2}'" MD5FILE);     fp = popen(capBuf, "r");     while(fgets(tabBuf, 34, fp)!=NULL){     }     pclose(fp);     return tabBuf; } 加static是为了影响tabBuf的生命周期，因为加了static之后，tabBuf是静态数组，在数据段上申请空间（而不是在栈上），返回栈上的空间是未定义行为； 也可以定义成指针，但是必须在堆上申请空间，因为堆上的空间生命周期也是从申请开始知道释放结束；即调用malloc和free函数（C++中也可以用new/delete） 使用完之后需要free，在该函数外释放；一般很容易忘释放；  使用static和堆上申请空间两种方法都是可以实现你的需求；但是也是有区别的；