我正在尝试创建一个映射,在该映射中我比较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"
并比较此临时字符串
答案 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
}