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

How to extract a sub char array from a char 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"

并比较这个临时字符串

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

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

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

没有理由在 for 循环中设置迭代。更好的方法是简单地循环,同时还有尚未输出的字符要输出。考虑输入字符串的 strlen ,您将其分成块大小的块并输出每次迭代。完成输出块后,只需从长度中减去块大小输出即可确定剩余的字符数。继续,直到少于块大小的字符或没有字符剩余。

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

无需使用 strcpy 等扫描字符串的末尾。您的块大小决定了每个子字符串中的字符数,因此您可以简单地 memcpy 您的字符,在 substring[blksz] 处添加 nul-terminating 字符,然后输出结果字符串(如您所示,使用转义引号)

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

#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;
    }
}

例子Use/Output

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

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