【问题标题】:C - get all substrings between two delimitersC - 获取两个分隔符之间的所有子字符串
【发布时间】:2021-04-04 18:09:41
【问题描述】:

我正在尝试创建一个响应用户输入的多个命令的应用程序。问题是这些命令有多个参数。一些例子是

login 'username' 'password'
add song 'song_name' 'description' 'genre' 'link'

输入被读入一个字符数组。

char recv[max]=" ";
if (read (fd, recv, sizeof (recv)) < 0)
    {
        perror ("[server]Error on read () from client.\n");
        return errno;
    }

这都是使用服务器的更大 uni 项目的一部分,所以这就是使用 read() 的原因。最大值定义为 1024。

虽然我可以使用 strstr() 来识别哪个命令是哪个命令,但我不确定如何将用户名、密码等作为单独的子字符串获取。

我知道我可以通过将输入+命令长度复制到另一个字符中来摆脱命令部分,因为它是固定的,但我很想知道如何选择两个 ' 之间的每个子字符串. strtok() 会完成这项工作吗?

提前致谢。

【问题讨论】:

  • 例如,strtok 可以按空格分割。但它不会处理带引号的字符串(例如,即使它在带引号的'description' 内,它也会在空格上拆分)。唯一可以处理此问题的“标准”工具可能是lex。但是编写自己的分词器可能会更简单,逐个字符地读取字符串。
  • 以不同的方式格式化输入会更容易吗?例如,使用不同的分隔符(或根本不使用)
  • 是的。例如,您可以有一个数字告诉您以下字符串的长度,从而避免引用和转义的任何问题。您还可以使用二进制编码的数据包,从而完全避开任何字符串解析。
  • 您应该从read 捕获返回值并终止任何“字符串”数据。
  • That 是可行的,从之前找到的' 的位置使用strchr() + 1。

标签: c char substring strtok strstr


【解决方案1】:

“以不同的方式格式化输入会更容易吗?”.

例如,给定以下多分隔符字符串:

char str[] = {"this,is|a:multi.delimited$string"};  
char *dup = strdup(str);
if(dup)
char *tok = strtok(dup,",");
if(tok)
{
     printf("%s\n", tok);
     tok = strtok(NULL, "|");
     if(tok)
     {
          printf("%s\n", tok);
           tok = strtok(NULL, ":");
           if(tok)
           {
                 //and so on through each unique delimiter 

说明如何使用 strtok() 轻松完成具有不同分隔符的字符串解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2012-04-27
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多