如何从字符数组中提取子字符数组
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"
检查一下,如果您还有其他问题,请告诉我。
我正在尝试创建一个映射,我在其中比较 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"
检查一下,如果您还有其他问题,请告诉我。