【问题标题】:How to extract a sub char array from a char array如何从字符数组中提取子字符数组
【发布时间】:2019-07-01 05:27:47
【问题描述】:

我正在尝试创建一个映射,在该映射中我比较 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"

并比较这个临时字符串

【问题讨论】:

  • 你读过strcat的文档吗?它复制一个字符串(在 C 中通常以 null 结尾),而不是一个字符。为什么要循环 [0,4) - 只有 4 个元素的范围?
  • 关于:char tempStr[5]=""; 这对于 5 个字符加上尾随的 NUL 字符来说不够大
  • 循环仅提取 4 个字符,但所需的输出显示提取 5 个字符

标签: c arrays char sub-array


【解决方案1】:

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

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

不需要使用strcpy等来扫描字符串的结尾。你的块大小决定了每个子字符串中的字符数,所以你可以简单地memcpy你的字符,添加nul - 在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"

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      相关资源
      最近更新 更多