C分解字符串时遇到的问题

COSE 发布于 2013/11/08 10:41
阅读 261
收藏 0

通过strsplit函数分解字符串:


size_t strsplit(char *arr[], const char *str, char *delim) {
    char *p, *p1;
    size_t i, len;
    
    p1 = (char *)str;
 
    i = 0;
    while ((p = strstr(p1, delim)) != NULL) {
        len = p - p1;
        strncpy(arr[i], p1, len);
        arr[i++][len] = '\0';
        p1 = p + strlen(delim);
    }
    strcpy(arr[i++], p1);
    return i;
}

int main(int argc, char *argv[]) {
    size_t i, n;
    char a[256] = "hehe is the hello world";
 
    char **arr;
    arr = (char **)malloc(sizeof(char *) * 10);
    for (i = 0; i < 10; ++i)
        arr[i] = (char *)malloc(sizeof(char) * 50);
    
    n = strsplit(arr, a, "he");
    for (i = 0; i < n; ++i) {
        printf("[%s]\n", arr[i]);
    }

    char s[10][100];
    n = strsplit(s, a, "he");
    for (i = 0; i < n; ++i) {
        printf("[%s]\n", s[i]);
    }
 
    for (i = 0; i < 10; ++i)
        free(arr[i]);
    free(arr);
    
    return 0;
}
分解char **arr能够正确运行,分解s[10][100]出现段错误


加载中
0
中山野鬼
中山野鬼

char ** arr 是一个空间,里面存放的数据是个地址。这个地址指向了另一个不定长的数组空间的起始地址。这个不定长的数组空间里,每个单元里面存放的数据还是个地址,这些地址分别指向其他的不定长的数组,而这些不定长的数组里存放的是依次排放的字符,如果你愿意在最后一个位置放了0,那么他们就是很多个字符串,显然这些字符串的地址并不需要是连续的。

char s[10][100],是一个数组。这个数组整体空间是10*100个。而s[i]是一种计算地址的方法。由编译器根据s的空间定义进行解析,s[i]将等于 s的基础地址+ 每个单元所占的字节数*100。

哈,不知道是否你理解了。。。简单说,arr指向的数组里,可以存放不同的指针。。

0
COSE
COSE

引用来自“中山野鬼”的答案

char ** arr 是一个空间,里面存放的数据是个地址。这个地址指向了另一个不定长的数组空间的起始地址。这个不定长的数组空间里,每个单元里面存放的数据还是个地址,这些地址分别指向其他的不定长的数组,而这些不定长的数组里存放的是依次排放的字符,如果你愿意在最后一个位置放了0,那么他们就是很多个字符串,显然这些字符串的地址并不需要是连续的。

char s[10][100],是一个数组。这个数组整体空间是10*100个。而s[i]是一种计算地址的方法。由编译器根据s的空间定义进行解析,s[i]将等于 s的基础地址+ 每个单元所占的字节数*100。

哈,不知道是否你理解了。。。简单说,arr指向的数组里,可以存放不同的指针。。

谢谢野鬼,此外函数的参数与接收变量类型是否应如下:

char arr[][100],接收变量char s[10][100];

char *arr[100],接收变量char *s[100];

char **arr,接收变量char **s;

由于参数类型的不同,只能接收不同类型的字符串数组,哪种方法比较通用?

0
中山野鬼
中山野鬼

引用来自“COSE”的答案

引用来自“中山野鬼”的答案

char ** arr 是一个空间,里面存放的数据是个地址。这个地址指向了另一个不定长的数组空间的起始地址。这个不定长的数组空间里,每个单元里面存放的数据还是个地址,这些地址分别指向其他的不定长的数组,而这些不定长的数组里存放的是依次排放的字符,如果你愿意在最后一个位置放了0,那么他们就是很多个字符串,显然这些字符串的地址并不需要是连续的。

char s[10][100],是一个数组。这个数组整体空间是10*100个。而s[i]是一种计算地址的方法。由编译器根据s的空间定义进行解析,s[i]将等于 s的基础地址+ 每个单元所占的字节数*100。

哈,不知道是否你理解了。。。简单说,arr指向的数组里,可以存放不同的指针。。

谢谢野鬼,此外函数的参数与接收变量类型是否应如下:

char arr[][100],接收变量char s[10][100];

char *arr[100],接收变量char *s[100];

char **arr,接收变量char **s;

由于参数类型的不同,只能接收不同类型的字符串数组,哪种方法比较通用?

自己跟踪地址理解吧。我要再说,你迟早会忘,不说,自己理解,以后都不会忘。哈。
0
COSE
COSE

引用来自“中山野鬼”的答案

引用来自“COSE”的答案

引用来自“中山野鬼”的答案

char ** arr 是一个空间,里面存放的数据是个地址。这个地址指向了另一个不定长的数组空间的起始地址。这个不定长的数组空间里,每个单元里面存放的数据还是个地址,这些地址分别指向其他的不定长的数组,而这些不定长的数组里存放的是依次排放的字符,如果你愿意在最后一个位置放了0,那么他们就是很多个字符串,显然这些字符串的地址并不需要是连续的。

char s[10][100],是一个数组。这个数组整体空间是10*100个。而s[i]是一种计算地址的方法。由编译器根据s的空间定义进行解析,s[i]将等于 s的基础地址+ 每个单元所占的字节数*100。

哈,不知道是否你理解了。。。简单说,arr指向的数组里,可以存放不同的指针。。

谢谢野鬼,此外函数的参数与接收变量类型是否应如下:

char arr[][100],接收变量char s[10][100];

char *arr[100],接收变量char *s[100];

char **arr,接收变量char **s;

由于参数类型的不同,只能接收不同类型的字符串数组,哪种方法比较通用?

自己跟踪地址理解吧。我要再说,你迟早会忘,不说,自己理解,以后都不会忘。哈。

果然错了, char *arr[100]为char (*s)[100]

返回顶部
顶部