回 帖 发 新 帖 刷新版面

主题:[讨论]C语言字符串求子串

我在求一个字符串的子串时遇到了一个棘手的问题。函数代码如下:
void subString(char *source,char *target,int start,int len){
    char *p = source + start,*q = target ,*p_end = source+ start +len;
    if(start+len<=strlen(source))
    while(p<p_end)
        *q++ = *p++;
    *q = '\0';
}
这个函数在一般情况下是对的,但是将函数调用格式变成:subString(string,string,4,2)时(这里假设string="helloworld!")。编译器(vs2008)会说这里对字符数组string访问出错而vc6.0则直接跳出程序执行。请问这是什么原因?应该如何改动这个函数,使得上述调用格式成立?

回复列表 (共3个回复)

沙发

subString(string,string,4,2)这里,source,target在funciton内指针的操作,LZ思考下。
我给一个实现方式,你可参照vs2003,vc6编译。运行正常。
[code=c]
int subString_s(char* source, char* dest, int start, int len)
{
    const int maxsize = 1024;
    int strLen = strlen(source);
    if (maxsize <= strLen)
        return -1;
    char* pBuffer = (char*)malloc(sizeof(char)*maxsize);
    strcpy(pBuffer, source);
    char* p = pBuffer + start;
    char* q = dest;
    char* pEnd = pBuffer + start + len;
    if ((start+len) <= strLen)
    {
        while( p < pEnd )
            *q++ = *p++;
    }
    *q = '\0';
    free(pBuffer);

    return 0;
}

int main(int, char **, char **)
{
    char szHello[] = "Hello World\0";

    if (subString_s(szHello, szHello, 5, 4) == 0)
    {
        printf("%s\n", szHello);
    }
}
[/code]

板凳

说得通俗一点,就是你把一个指针内的内存值做了不当修改。尤其是如果你的source是char const*(用类似char *a="test";形式初始化的字符串)的时候,这个修改是非法的(试图修改字符常量)

3 楼

char *s ="abc";      //“abc”常量字符串。常量字符串不能修改
char s[] ="abc";     //数组里存着字符串数据a,b,c

我来回复

您尚未登录,请登录后再回复。点此登录或注册