2015-05-20 50 views
1

我想要的是创建具有特定lenght一个新的字符串的函数。 这是代码:问题与字符串创建Ç

char* newString(int lenght){ 

    char* newstring =(char*)((calloc(lenght, sizeof(char)))); 
    newstring[lenght] = '\0'; 
    return newstring; 
} 

我使用了这种方式:

char* string = newString(10); 

我的问题是,当我这样做:

printf("String lenght %lu \n",strlen(string)); 

我得到0,但我不知道理解为什么。 我是新手与C 感谢您的时间

+1

因为'calloc'零初始化您的数组,并且您从不填充任何东西。此外,它的拼写“长度” –

+1

...你正在使用'T [lenght] =“\ 0''不分,从而调用不确定的行为超出分配给您的长度。 C中的数组是零基索引的。含义'0 ...(lenght-1)'是索引的允许范围。 – WhozCraig

+0

't [length] ='\ 0';'是一个超出限制的写入。 – Xaqq

回答

0

如果长度不包括空终止,那么你应该设置T [长度 - 1]为零,或尺寸为长或者释放calloc + 1

+1

如果发布一个答案,也许认为回答这个问题的问题贴:为什么'strlen的(串)''报告0'。 – WhozCraig

4

strlen返回第一个'\0'之前的字符数。如果您使用:

char s[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
int len = strlen(s); // len will be zero. 
1

这里有几个问题。首先是你在终止t(并且我不确定实际引用了什么),在索引“length”处有一个空终止符,它将比数组的大小大1。所以你正在访问一些随机blob的内存。其次是不恰当地使用calloc。我想你想要更多的东西一样:

char* new_string(int length) { 
    char* new_string; 
    new_string = malloc(sizeof(char) * length); 
    memset(new_string, 0, length); 
    new_string[length-1] = '\0'; 
    return new_string; 
} 

strlen的在你的例子返回0,因为它的空终止,这发生在你的实现是0之前计数的字符。

+0

为什么calloc函数不好? –

+1

OP使用'calloc'是正确的。你做同样的事情,只是更多的代码行。从技术上讲,这一切功能,所要做的就是'回报释放calloc(长度的sizeof(字符));' –

+0

我知道释放calloc功能将内存(除分配内存),该函数memset的做同样的事情?有什么变化? –

0

strlen的字符计数的数目在c串,直到它看到“\ 0”(字符串的末尾),以便你的字符串与初始化“\ 0”其长度实际上为0变化这个值到另一个喜欢。

memcpy(string, "good things", 10); 
    printf("%d", strlen(string));