C语言sprintf函数的应用:字符串解析

我之前写过一篇博客,讲解sprintf和sscanf函数,没看过的朋友们可以去看一下。这篇文章讲解sprintf函数一个非常常见的应用:字符串解析。我会用力扣的一道经典题目作为例子:链接

C语言sprintf函数的应用:字符串解析_第1张图片

思路

这道题的原理是,把根据不同的字符串,做不同的处理,规则如下:

  1. G -> G
  2. () -> o
  3. (al) -> al

明白了原理,接下来的事就简单了。我们只需要遍历原来的字符串,根据“扫描”到的不同的组合,转换为对应的组合,再输出到结果字符串中。

比如:

for (int i = 0; i < len; ++i)
{
    if (command[i] == 'G')
    {
        // 输出结果G
    }
    else if (command[i] == '(')
    {
        if (command[i + 1] == ')')
        {
            // 输出结果o
        }
        else
        {
            // 输出结果al
        }
    }
}

怎么“输出”结果呢?当然是用sprintf啦!比如,输出G就这么写:

sprintf(ret, "G");

但是,sprintf每次都是从起始位置,覆盖式的写入。我们想要的是,第二次不是从ret这个位置写入了,假设是从ret+pos的位置写入。那么,每次写入后,pos都需要加一个数,这个数就是写入的字符数,那如何获取写入的字符数呢?很简单,sprintf会返回每次写入了多少个字符!知道这个思路后,是不是就简单了?

只需要每次在ret+pos的位置,使用sprintf写入对应转换出来的字符序列,每次更新pos,让pos加上sprintf函数的返回值即可。

代码

char * interpret(char * command){
    int len = strlen(command);
    char* ret = (char*)malloc(sizeof(char) * (len+1));
    if (ret == NULL)
    {
        perror("malloc");
        return NULL;
    }

    int pos = 0;
    for (int i = 0; i < len; ++i)
    {
        if (command[i] == 'G')
        {
            pos += sprintf(ret+pos, "G");
        }
        else if (command[i] == '(')
        {
            if (command[i+1] == ')')
            {
                pos += sprintf(ret+pos, "o");
            }
            else
            {
                pos += sprintf(ret+pos, "al");
            }
        }
    }

    return ret;
}

总结

  1. 当我们需要把一个字符序列“写入”到一个字符串中时,可以考虑sprintf函数。
  2. sprintf函数会返回写入的字符的个数,可以利用这一点,每次更新写入的位置。

感谢大家的阅读!

你可能感兴趣的:(C语言,c语言,c++,算法,开发语言,字符串解析)