我正在尝试在c上创建子字符串函数。它必须返回“cdef”,但它什么都不返回。我该如何解决?感谢。
#include<stdio.h>
#include<conio.h>
#include<string.h>
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[b-a];
char tmp[2];
strcpy(nText, "");
for(int i=a; i<b; i++){
tmp[0] = text[i];
tmp[1] = '\0';
strcat(nText, tmp);
}
return nText;
}
答案 0 :(得分:3)
您错误地返回指向函数返回后可能不存在的变量的指针。您需要在调用函数中分配空间,只需将结果放在提供的空间中,或者使用static
在函数中创建永久空间。注意 - 正如Jonathan Leffler所指出的那样 - 由于空间是“永久的”,你不能将块的长度从一个调用改为下一个调用,你必须选择一个“合理的”值并测试{{ 1}}不长于分配的空间。因此,我的第二种方法更加健壮。
b-a+1
正如Employed Russian指出的那样,以这种方式使用静态在任何情况下都是非常危险的,因为当你仍在使用第一次调用的结果时,另一段代码可能会调用此函数。如果您进行任何类型的多线程,这是不可行的,但如果您有一个线程,这是一个快速修复。
更好的配方是
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;
}
在后一种情况下,您在调用函数中创建空间并将指针传递给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<b;i++) nText[i-a]=text[i];
nText[b-a] = '\0';
元素,否则最终nText[b-a+1]
没有空间。
答案 1 :(得分:1)
你的错误在这里:
char* substring(char *text, int a, int b){
char nText[b-a];
...
return nText;
}
从函数返回后,您返回的缓冲区将变为无效。
GCC很好地警告你:
t.c:24:5: warning: function returns address of local variable [enabled by default]
我该如何解决?
你必须分配一个新的缓冲区(并且调用者必须释放它),或者让调用者提供输出缓冲区(如Floris建议的那样)。
答案 2 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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], b-a);
ntext[b-a] = 0;
return nText;
}
//copy to reserve area
char* substringb(char *substr, char *text, int a, int b){
substr[b-a]=0;
return strncpy(substr, &text[a], b-a);
}