所以这很奇怪-下面是我创建标记赋予器对象和主方法的代码:

struct TokenizerT_ {
    char * sep;
    char * toks;
};

TokenizerT *TKCreate(char *separators, char *ts) {

    if (ts==NULL) {
        return NULL;
    }

    int lin = (int) strlen(separators);
    char yr[lin];
    yr[0] = *separators;
    int lim = 1;
    int h = 1;

    for(h=1; h<strlen(separators); h++){
        char tmp = *(separators+h);
        int z=0;

        for (z=0; z<lim; z++) {
            if (tmp==yr[z]) {
                z=-1;
                break;
            }
        }
        if(z>-1){
            yr[h] = tmp;
            lim++;
        }

    }
    TokenizerT inu = {yr, ts};
    printf("%s\n", inu.sep);
    return &inu;
}

int main(int argc, char **argv) {

    char * arr = argv[1];
    char * y = argv[2];
    TokenizerT jer = *TKCreate(arr, y);

    printf("%s\n", jer.sep);
    printf("%s\n", jer.toks);
    return 0;
}

如果我使用参数“tes”和“testing”运行程序,将得到以下结果:
测试
测试
测试
但是,如果我在TKCreate中运行带有printf语句注释的程序,则会得到:
测试。
printf(“%s\n”,jer.sep)停止工作,除了在TKCreate中注释printf语句外,我对代码没有做任何操作。为什么会这样?

最佳答案

这里有很多问题:
inu是一个局部变量。你把地址还给我。当您试图从main中的该地址读取时,您正在访问一个不再在作用域中的变量。这是不明确的行为。
sepinu字段被指定为yr。现在,yr是一个局部变量,一个字符数组,它衰减为指针。同样,一旦函数返回,访问它就意味着访问其作用域已结束的变量。同样,行为不明确。
您使用的是可变长度数组,一个VLA。我怀疑这不是故意的。一般来说,VLAs是高级特性,只有当您清楚其含义时才应该使用。
我建议进行以下更改:
使用malloc动态分配字符数组。
按值返回结构。
除此之外,我怀疑你还有其他问题。在我看来,yr不是以空结尾的,有些元素可能根本没有初始化。这是故意的吗?也许您实际上是想在编写yr时将separators初始化为等于yr[0] = *separators。注意,您的代码只分配一个字符。要动态分配yr,并将其初始化为等于separators,可以编写:

yr := malloc(strlen(separators)+1);
strcpy(yr, separators);

为什么要多次呼叫strlen(separators)?你似乎称之为1+strlen(separators)次。你应该只打一次电话。

关于c - 除非先前已打印,否则char数组不会在C中打印,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21532352/

10-11 04:25