在C中查找子字符串

时间:2017-07-27 13:45:50

标签: c substring

我想从带有签名函数的字符数组中提取子字符串:

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循环的方法,但我仍然认为我的代码应该正常工作。为什么我的代码不起作用?

3 个答案:

答案 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;
}