【问题标题】:How to remove quotes from a string in C如何从C中的字符串中删除引号
【发布时间】:2011-08-22 06:34:26
【问题描述】:

我正在尝试删除给定行中的所有引号,除了反斜杠后跟引号

我做的是这个

for (int i = 0; i < lineLength; i ++) {

        if (line[i] == '"' ) { 
                if (line[i-1] == '\\') // if \" is used   
                        line[i-1] = '"'; // then print \
                line[i] = '\0'; // or 0
        }
}

这将删除该行中的所有字符.. 我可以做些什么来只删除引号? 任何帮助将不胜感激...

【问题讨论】:

    标签: c quotes


    【解决方案1】:

    您的问题是line[i] = '\0'; - 它终止了字符串。

    如果你想从 C 字符串中删除字符,你需要保存两个索引 - 一个用于读取,一个用于写入,循环读取每个字符的读取索引,并只写入你想要继续使用的第二个索引索引。

    类似的东西:

    int j = 0;
    for (int i = 0; i < lineLength; i ++) {
                if (line[i] != '"' && line[i] != '\\') { 
                     line[j++] = line[i];
                } else if (line[i+1] == '"' && line[i] == '\\') { 
                     line[j++] = '"';
                } else if (line[i+1] != '"' && line[i] == '\\') { 
                     line[j++] = '\\';
                }
    }
    
    //You missed the string termination ;)
    if(j>0) line[j]=0;
    

    【讨论】:

      【解决方案2】:

      您将找到的第一个 " 字符设置为空字符,从而终止字符串。

      另外,当i == 0line[i-1] 可能会导致分段错误,或者它可能恰好包含\,在这种情况下第一个引号不会被剥离。

      这样的事情会做你想做的事:

      char *lineWithoutQuotes = malloc(strlen(line));
      int i, j;
      if(line[0] != '"')
          lineWithoutQuotes[0] = line[0];
      for(i = j = 1; i < strlen(line); i++){
          if(line[i] == '"' && line[i-1] != '\\')
              continue;
          lineWithoutQuotes[j++] = line[i];
      }
      

      【讨论】:

        【解决方案3】:

        使用索引的常规技术是:

        int j = 0;
        for (int i = 0; i < lineLength; i++)
        {
            if (line[i] == '\\')
            {
                line[j++] = line[i++];
                line[j++] = line[i];
                if (line[i] == '\0')
                    break;
            }
            else if (line[i] != '"')
                line[j++] = line[i];
        }
        line[j] = '\0';
        

        使用指针(并且不需要lineLength),它是:

        char *dst = line;
        char *src = line;
        char c;
        
        while ((c = *src++) != '\0')
        {
            if (c == '\\')
            {
                *dst++ = c;
                if ((c = *src++) == '\0')
                    break;
                *dst++ = c;
            }
            else if (c != '"')
                *dst++ = c;
        }
        *dst = '\0';
        

        或者这些主题的细微变化......

        【讨论】:

          【解决方案4】:
          int newPos = 0;
          for (int oldPos = 0; oldPos < lineLength; oldPos++) {
              if (!(line[newPos] == '"' && (!newPos || line[newPos-1] == '\\'))) {
                 line[newPos] = line[oldPos];
                 newPos++;
              }
          }
          line[newPos] = 0;
          

          【讨论】:

            猜你喜欢
            • 2020-07-10
            • 2022-01-01
            • 2011-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-28
            • 1970-01-01
            • 2012-06-25
            相关资源
            最近更新 更多