【问题标题】:C - format String to arrayC - 将字符串格式化为数组
【发布时间】:2021-05-10 01:51:13
【问题描述】:
char str1 [] =
    "{ \'Carl Maria von Weber\', \'weber\', 8 }{ \' Maria  von   Carl Weber \', \'weber\', 1 }\n"
    "{ \'Carl Weber Maria von\', \'weber\', 2 }\n"
    "{ \'Carl-Maria von Weber\', \'weber\', 4 }\n"
    "{ \'Chuck Norris\', \'norrischuck\', 100 }";

如果我有这样一个字符串,我该如何将它存储在字段中,所以我应该

char field [0] = Carl Maria von Weber
char field [1] = weber
char field [2] = 8

我创建了以下代码,该代码还在字段中存储 {} 字符。我可以在使用函数之前编辑字符串 str 以便字符 {},?被删除。或者我错了,你知道其他程序吗?

char *src;  
char a[2000];
src=a;

fscanf(fp,"%[^\"]",src);
//printf("%s\n",src);

int count=1000;
char output[1000][1000];    
int i = 0;
while (i < count) {
    const char *start;
    int len;
    while (isspace((unsigned char)*src))
        src++;
    if (*src == '\0')
        break;
    if (*src == '\'') {
        start = ++src;
        len = strcspn(src, "\'");
        src += len;
        if (*src == '\'')
            src++;
    } else
    if (*src == '\"') {
        start = ++src;
        len = strcspn(src, "\"");
        src += len;
        if (*src == '\"')
            src++;
    } else {
        start = src;
        len = strcspn(src, " \t\f\v\r\n");
        src += len;
    }
    snprintf(output[i], sizeof(output[i]), "%.*s", len, start);
    i++;
}

【问题讨论】:

  • 来自aaron18 的 4 个问题和来自aaron9999 的 2 个类似问题,它们是关于类似任务的。也许你们两个应该交换笔记。

标签: arrays c string function pointers


【解决方案1】:

由于您的问题不包含对字符串的任何要求,我假设

  • 记录格式为{ \'name1\', \'name2\', value }(部分之间的所有空格都很重要)
  • 第一个字段最多100个字符,只能包含字母字符、空格或-
  • 第二个字段最多 100 个字符,并且只能包含字母字符或空格
  • 第三个字段是一个数字。

从您的示例代码中,我假设最多也有 1000 条记录。此代码解析并打印您的示例字符串:

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

struct parsedStruct
{
  char name1[100];   // Carl Maria von Weber
  char name2[100];   // weber
  int value;         // 8
};

int main (void)
{
  char str1[] =
    "{ \'Carl Maria von Weber\', \'weber\', 8 }{ \' Maria  von   Carl Weber \', \'weber\', 1 }\n"
    "{ \'Carl Weber Maria von\', \'weber\', 2 }\n"
    "{ \'Carl-Maria von Weber\', \'weber\', 4 }\n"
    "{ \'Chuck Norris\', \'norrischuck\', 100 }";

  FILE *fp = fmemopen(str1, sizeof(str1), "r");
  if (fp)
  {
    struct parsedStruct output[1000];
    int numMatched, i = 0;
    do
    {
      numMatched = fscanf(fp, "{ \'%100[-a-zA-Z ]\', \'%100[a-zA-Z ]\', %d }", output[i].name1, output[i].name2, &output[i].value);
      if (feof(fp) || ferror(fp))
        break;
      if (numMatched == 3)
        ++i;
      else
        fgetc(fp);
    } while (i < sizeof(output) / sizeof(output[0]));

    fclose(fp);

    for(int j = 0; j < i; ++j)
      printf("%s, %s, %d\n", output[j].name1, output[j].name2, output[j].value);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2014-11-30
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多