从函数返回一个字符串

我正在尝试在c上创建子字符串函数。 它必须返回“cdef”,但它什么都不返回。 我该如何解决? 谢谢。

#include #include #include char* substring( char *, int, int ); int main(){ char stuff[] = "abcdefghjklmnoprstuvyz"; printf("%s\n", stuff); printf("%s\n", substring(stuff, 2, 6)); getch(); return 0; } char* substring(char *text, int a, int b){ char nText[ba]; char tmp[2]; strcpy(nText, ""); for(int i=a; i<b; i++){ tmp[0] = text[i]; tmp[1] = '\0'; strcat(nText, tmp); } return nText; } 

您错误地返回指向函数返回后可能不存在的变量的指针。 您需要在调用函数中分配空间,只需将结果放在提供的空间中,或者在函数中使用static创建永久空间。 注意 – 正如Jonathan Leffler所指出的那样 – 由于空间是“永久的”,你不能将块的长度从一个调用改为下一个调用,你必须选择一个“合理的”值并测试b-a+1不长于分配的空间。 因此我的第二种方法更加健壮。

 char* substring(char *text, int a, int b){ static char nText[100]; if ((b-a+1)>100) // do something! you can't copy this! // code return nText; } 

正如Employed Russian指出的那样,以这种方式使用静态在任何情况下都是非常危险的,因为当你仍在使用第一次调用的结果时,另一段代码可能会调用此函数。 如果您进行任何类型的multithreading,这是不可行的,但如果您有一个线程,这是一个快速解决方案。

更好的配方是

 void substring(char *text, int a, int b, char *nText) { // code, nothing to return } 

在后一种情况下,您在调用函数中创建空间并将指针传递给substring 。 你的主程序

 char shortString[100]; substring(stuff, 4, 6, shortString); printf("%s\n", shortString); 

另外,复制子字符串的方法非常低效。 考虑用它替换它

 for(int i=a; i 

从中您可以看到您实际需要分配nText[b-a+1]元素,否则最终'\0'没有空间。

你的错误在这里:

 char* substring(char *text, int a, int b){ char nText[ba]; ... return nText; } 

从函数返回后,返回的缓冲区将变为无效

海湾合作委员会很好地警告你:

 tc:24:5: warning: function returns address of local variable [enabled by default] 

我该如何解决?

你必须分配一个新的缓冲区(并且调用者必须释放它),或让调用者提供输出缓冲区(如Floris建议的那样)。

 #include  #include  #include  char* substring( char *, int, int ); char* substringb(char *substr, char *text, int a, int b); int main(){ char stuff[] = "abcdefghjklmnoprstuvyz"; char substr[5]; printf("%s\n", stuff); printf("%s\n", substring(stuff, 2, 6));//Things to think to be able to release! printf("%s\n", substringb(substr, stuff, 2, 6)); getch(); return 0; } //dynamic allocate char* substring(char *text, int a, int b){ char *nText; nText = (char*)malloc((b-a+1)*sizeof(char)); strncpy(nText, &text[a], ba); ntext[ba] = 0; return nText; } //copy to reserve area char* substringb(char *substr, char *text, int a, int b){ substr[ba]=0; return strncpy(substr, &text[a], ba); }