【问题标题】:C - Delete spaces around specific char in stringC - 删除字符串中特定字符周围的空格
【发布时间】:2016-03-10 04:01:57
【问题描述】:

我有一串 80 个字符(来自 .txt 文件的行)
在字符串末尾的某处,我有数字或字符串或字符以及它们之间的“,”(逗号)。
我需要删除“,”周围的这些空格,这样我才能通过strtok() 获取它们。
有任何想法吗 ?
例如:

String : " name: today 12 ,r ,ab,     5     ,   seven"<br>

我需要:" name: today 12,r,ab,5,seven"

【问题讨论】:

    标签: c arrays char spaces


    【解决方案1】:

    你可以应用这个算法::

    1. 查找元素,在本例中为空格。
    2. 将元素替换为您选择的元素,在本例中为空字符。

    这个函数可以很方便地将任何字符替换为字符串。您可以将 char *replace 函数添加为 sn-p 并稍后将其用于类似目的。

       char *replace(const char *the_input_string, char the_character,
                     const char *replacing_string) 
      {
          int count = 0;
          const char *t;
          for(t=the_input_string; *t; t++)
              count += (*t == the_character);
    
          size_t rlen = strlen(replacing_string);
          char *res = (char*)malloc(strlen(the_input_string) + (rlen-1)*count + 1);
          char *ptr = res;
          for(t=the_input_string; *t; t++) 
          {
              if(*t == the_character) 
              {
                  memcpy(ptr, replacing_string, rlen);
                  ptr += rlen;
              }
              else 
                  *ptr++ = *t;
          }
          *ptr = 0;
          return res;
      }
    

    驱动程序::

    int main(int argc, char const *argv[])
    {
        const char *s = replace("name: today 12 ,r ,ab, 5 , seven", ' ', "");
        printf("%s\n", s);
        return 0;
    }
    

    请参考this link ,代码可能非常相似,但请使用上面的代码,因为其中提到的解决方案可能会引发一些错误或警告。

    【讨论】:

      【解决方案2】:

      因为生成的字符串会比原始字符串短,所以可以就地替换:找到逗号时,复制它并跳过后面的空格。要处理逗号之前的空格,请跟踪最后一个非空格字符之后的第一个空格,并在必要时跳过该空格:

          #include <stdlib.h>
          #include <stdio.h>
          #include <ctype.h>
      
          void remspc(char *str)
          {
              char *first = str;          // dest. char after last non-space
              char *q = str;              // destination pointer
      
              // skip leading white space
              while (isspace((unsigned char) *str)) str++;
      
              while (*str) {
                  if (*str == ',') {
                      q = first;          // skip space before comma
                      *q++ = *str++;
                      first = q;
      
                      // skip space after comma
                      while (isspace((unsigned char) *str)) str++;
                  } else {
                      // remember last non-space
                      if (!isspace((unsigned char) *str)) first = q + 1;
                      *q++ = *str++;
                  }
              }
      
              *first = '\0';
          }
      
          int main(void)
          {
              char str[] = " name: today 12, r ,ab,   ,   5     ,   seven";
      
              remspc(str);
              puts(str);
      
              return 0;
         }
      

      此解决方案会将由空格分隔的逗号一起运行,这可能会导致strtok 出现问题,因为它将逗号的延伸视为单个分隔符。

      【讨论】:

      • 这很好用,唯一的缺点是它删除了字符串开头的空格,在“name”之前。我会改变它。谢谢
      • 好吧,我认为您可以找出导致该问题的行并将其删除。当然,您可以根据需要随意修改代码。
      【解决方案3】:

      你可以试试这个!
      必要时替换为您的代码。

      #include <stdio.h>
      #include <stdlib.h>
      
      int main()
      {   int i;
          char line[] = "name: today 12 ,r ,ab, 5 , seven";
          int length = strlen(line);
          char line2[length];
          for(i = 0; i<length; i++) {
              if(!isspace(line[i])) {
                   line2[i] = line[i];
              }
          }
          for(i = 0; i<length; i++){
              printf("%c", line2[i]);
          }
          return 0;
      }
      

      【讨论】:

      • 这将删除所有空格,而我只需要删除“,”周围的空格
      • 此解决方案还会在目标字符串中留下空白,因为您对源和目标使用相同的索引,但目标。
      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多