char *substring(char *string, int index, int length)
{
//int counter = length - index;
int counter = 0;
for(;string[index] != string[length];index++, counter++);
printf("\n%d\n", counter);
char *array = malloc(sizeof(char) * counter);
if(array != NULL)
{
///while(string[index] != string[length])
while(index != length)
{
array[index] = string[index];
index++;
array++;
}
}
else
puts("Dynamic allocations failed\n");
return array;
}
1 - 我已经用“长度 - 索引”来评论初始化计数器,因为我对它感觉不舒服(我还有点像循环的一行:))。所以,如果我以这种更简单的方式使用它,我可以指望反击。
2 - 我对此代码的问题在于它没有返回任何内容。我尝试printf结果但没有打印,当我将函数的结果分配给char *时,我得到一个错误,说我不能为char *分配一个空格。但它如何回归无效?
3 - 我可以用指针算法编写这个函数而根本没有任何数组索引吗?!
4 - 我可以改变char *数组吗?!我问这个是因为我认为char *不能变异,但我读过一个正确改变了char *的代码。或者是我混淆了常规字符*和字符串?
注意:我不想使用字符串库函数
答案 0 :(得分:3)
您的代码存在一些问题。
for(;string[index] != string[length];index++, counter++);
首先,在上面一行中,你需要从长度中减去一个,因为数组是0索引的。
如果子字符串的最后一个字符在子字符串中的其他位置重复,则该行也将中断。例如aba
,其中index = 0,length = 3.即使你没有到达子串的末尾,你的循环也会立即停止,因为string [0] == string [2]。
但是,用于计算子字符串长度的整个循环是不必要的,只需使用length
!
char* array = malloc(length + 1);
请注意,您需要+1
包含C字符串中标准的空终止符。
接下来,如果index
不为0,则此行无法正常工作。
array[index] = string[index];
index
是string
的索引,而不是array
的索引。您应该为迭代器使用另一个变量,该变量从索引开始然后递增。然后你可以从迭代器中减去index
来获得子串array
中的实际索引。
int i = index;
while(i < length)
{
array[i - index] = string[i];
}
另请注意,循环中的这一行是不必要的,会破坏您的代码。
array++;
您的迭代器正在递增,因此您无需递增array
指针。另外,如果你直接增加array
,那么当你返回它时,它指向哪里?它指向字符串的结尾,而不是开头,所以当然你没有输出。
最后,不要忘记添加空终止符。循环之后,因为你的迭代器现在可以方便地指向最后一个索引,只需执行
array[i] = '\0';
作为额外的,因为您专门创建一个新字符串来保存子字符串而不修改原始string
指针,所以您应该将字符串的参数声明为const
。例如:const char *string
。这不是必需的,但是number of reasons的const正确性非常重要。
如果您进行了上述更改,您的代码应该可以正常工作。我没有发布已完成的代码,因为我认为自己进行更改是一项有价值的练习。
答案 1 :(得分:1)
1 - 您可以使用for循环,但这是一种缓慢的方式。简单的减法可以立即完成相同的工作,我认为没有理由不对它感到满意。
2 - Printf - 删除for循环末尾的分号,关于指针:
void *
是通用指针类型。您应该将其转换为char *
,如下所示:
char *array = (char *)malloc(sizeof(char) * counter);
3 - 是的,*(ptr + 3)
相当于ptr[3]
。在大多数实现中,使用指针也要快一点。
4 - 是的,您可以修改char *
指针指向的内存。它会修改原始字符串,但我不确定这是否是你的目标。
答案 2 :(得分:0)
100%工作
#include "stdafx.h"
#include "stdlib.h"
void substring(char * src, char * dst, int index, int length);
int _tmain(int argc, _TCHAR* argv[])
{
char orig[]="test";
char * newchar = (char*)malloc(2);//1 char + null
substring(orig, newchar, 1, 1);
printf(newchar);
free(newchar);
system("pause");
return 0;
}
void substring(char * src, char * dst, int index, int length)
{
// Assign src_index to our initial index
// Assign a new counter for dst position
// We want only up to the length hence index+length
// Increment src_index and dst_index
for(int src_index = index, dst_index = 0; src_index < index + length; src_index ++, dst_index++)
{
dst[dst_index] = src[src_index];
}
dst[length++] = '\0'; // Null terminate the string, we already accounted for this above.
}