如何从字符数组中提取子字符数组

时间:2019-02-07 06:31:46

标签: c arrays char sub-array

我正在尝试创建一个映射,在该映射中我比较5个字符并将它们与大小写匹配。我的问题是char数组的语法,也许有一种更简单的方法来提取子数组。

我的一般想法是:

char str[80];
char tempStr[5]="";
int i=0;

for(i=0; i<4; i++){
   strcat(tempStr,str[i]);


}
// match tempStr to cases
// go back to loop through for the next tempStr

示例输入:

"Iliveon123streetUnitedStatesOfAmericaSSS"

每次循环浏览时,我都希望提取

的子数组
"Ilive"
"on123"
"stree"
"tUnit"
"edSta"
"tesOf"
"Ameri"
"caSSS"

并比较此临时字符串

2 个答案:

答案 0 :(得分:1)

没有理由在for循环中设置迭代。更好的方法是仅在有尚待输出的字符输出时循环。考虑一下输入字符串的strlen,您将把它分成块大小的块并输出每次迭代。输出完块后,只需从长度中减去块大小输出即可确定剩余的字符数。继续进行操作,直到少于字符的字符或没有剩余字符为止。

如果在最后一次迭代中要输出的字符数少于完整的块大小,则只需将块大小更新为剩余长度,然后输出该字符数即可。

不需要使用strcpy等来扫描字符串的末尾。您的块大小确定每个子字符串中的字符数,因此您只需memcpy个字符,即可添加在substring[blksz]处使用终止符字符,然后输出结果字符串(如显示的那样带有转义引号)

使用您的输入的最小示例可能是:

#include <stdio.h>
#include <string.h>

#define BLKSZ 5

int main (void) {

    char str[] = "Iliveon123streetUnitedStatesOfAmericaSSS",
        blk[BLKSZ + 1];         /* storage for each substring */
    size_t len = strlen (str),  /* length of str */
        blksz = BLKSZ,          /* initial blocksize */
        n = 0;                  /* block counter */

    while (len) {           /* while chars remain to copy */
        memcpy (blk, str + n++ * BLKSZ, blksz); /* copy blocksize chars */
        blk[blksz] = 0;     /* nul-terminate block */
        printf ("\"%s\"\n", blk);   /* output block */
        len -= blksz;       /* subtract blocksize from len */
        if (len < blksz)    /* less than blocksize remains, blksz is len */
            blksz = len;
    }
}

使用/输出示例

$ ./bin/strsubstr
"Ilive"
"on123"
"stree"
"tUnit"
"edSta"
"tesOf"
"Ameri"
"caSSS"

仔细检查一下,如果还有其他问题,请告诉我。

答案 1 :(得分:0)

首先,tempStr必须为6个字节长(字符为5个字节,最后0个字符为1个字节)。

您可以使用这样的循环“提取”字符串的5个字符子字符串:

for (i = 0; i < strlen(inputString); i += 5) {
    strncpy(tempStr, inputString + i, 5);
    tempStr[5] = 0;
    // do something
}