我想从带有签名函数的字符数组中提取子字符串:
void substring (char str[], int start, int count, char result[]);
这是我的尝试:
void substring (char str[], int start, int count, char result[])
{
int i;
int j = 0;
for(i = start; i <= count; i++)
{
result[j] = str[i];
j++;
printf("the character in function call : %c \n", result[j]);
printf("the count of j is : %i \n", j);
}
result[j] = '\0';
printf("the result function call : %s \n", result);
}
int main (void)
{
char pet[] = "character";
char result[40];
substring (pet, 4, 3, result);
printf("the substring of character from 4, 3 step ahead is : %s \n", result);
return 0;
}
但我在控制台窗口中根本没有得到任何结果。我在网络上找到了另一种带有while循环的方法,但我仍然认为我的代码应该正常工作。为什么我的代码不起作用?
答案 0 :(得分:1)
问题出在这一行:
for(i = start; i <= count; i++)
第一次进入此for
循环时,i
为4,低于count
,其值为3.因此它退出循环并且不会打印任何内容
您必须将其更改为:
for(i = start; i < start + count; i++)
答案 1 :(得分:1)
你的for循环的条件是错误的。它应该是i < start + count
,因此你的for循环必须是:
for (i = start; i < start + count; i++) { ... }
根据您的情况计算,例如达到3,4,5,6直到结束(6将不会被执行),同时注意使用<
而不是<=
。
在您的情况下,输出将是:"act"
。
您可以使用strncpy
替换每个字符的for循环,described at this manpage(synoptics:char *strncpy(char *dest, const char *src, size_t n);
)。
就像这样:
strncpy(result, str + start, count);
result[start + count] = '\0';
此外,您应该考虑通过在输入缓冲区上使用str
并传递缓冲区,使您的函数对输入(result
)和输出(strlen
)字符串的缓冲区溢出具有鲁棒性函数输出缓冲区的大小,并根据start和count检查这些长度。另一种可能性是以正确的大小动态分配输出缓冲区,但仍应检查输入缓冲区。
答案 2 :(得分:0)
void substring (char str[], int start, int count, char result[]) {
int i;
int j = 0;
for(i = start; i <= count + start; i++) { // your problem are i <= count
result[j] = str[i];
j++;
printf("the character in function call : %c \n", result[j]);
printf("the count of j is : %i \n", j);
}
result[j] = '\0';
printf("the result function call : %s \n", result);
}
OR
没有循环的快速子串
#include <stdio.h>
#include <string.h>
void substring (char *str, int start, int count, char *result) {
if((start + count) > strlen(str)){ // ensuring the data to be taken
// does not exceed the length of the data.
result = '\0';
}
strncpy(result, str + start, count); // The copy of the character from str to result
// starting from the start along count characters.
result[start+count] = '\0'; // null terminator
}
int main(){
char ret[128];
char *src = "character"; // similiar with src[] =
memset(ret, '\0', 128); // clear retbuffer
substring(src, 4, 3, ret); // get src from index 4 along 3 characters.
printf ("result= %s\n", ret); // result= act
return 0;
}