我刚接触C语言,正在学习C90.

我的目标是解析如下字符串:

NA ME, NAME   , 123 456, 124   , 14134, 134. 134   ,   1   

对此:

NA ME,NAME,123 456,124,14134,134. 134,1

因此,参数中的白色字符仍然存在,但其他白色字符被移除.

我考虑过使用strtok,但我仍然想保留逗号,即使有多个连续的逗号.

到目前为止,我一直使用:

void removeWhiteChars(char *s)
{
    int i = 0;
    int count = 0;
    int inNum = 0;
    while (s[i])
    {
        if (isdigit(s[i]))
        {
            inNum = 1;
        }
        if (s[i] == ',')
        {
            inNum = 0;
        }
        if (!isspace(s[i]) && !inNum)
            s[count++] = s[i];
        else if (inNum)
        {
            s[count++] = s[i];
        }

        ++i;
    }
    s[count] = '\0'; /* adding NULL-terminate to the string */
}

但它只跳过数字,直到逗号,才删除数字后面的白色字符,这是完全错误的.

我很感激任何帮助,我已经被困在这件事上两天了.

推荐答案

每当你遇到可能被跳过的空白时,你需要做lookaheads.下面的函数每次看到空格时,都会向前判断是否以逗号结尾.同样,对于每个逗号,它都会判断并删除以下所有空格.

// Remove elements str[index] to str[index+len] in place
void splice (char * str, int index, int len) {
  while (str[index+len]) {
    str[index] = str[index+len];
    index++;
  }
  str[index] = 0;
}

void removeWhiteChars (char * str) {
  int index=0, seq_len;

  while (str[index]) {
    if (str[index] == ' ') {
      seq_len = 0;

      while (str[index+seq_len] == ' ') seq_len++;

      if (str[index+seq_len] == ',') {
        splice(str, index, seq_len);
      }
    }
    if (str[index] == ',') {
      seq_len = 0;
      while (str[index+seq_len+1] == ' ') seq_len++;

      if (seq_len) {
        splice(str, index+1, seq_len);
      }
    }
    index++;
  }
}

C++相关问答推荐

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

与unions 的未定义行为

SDL 2.0-从数组渲染纹理

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

字符是否必须转换为无符号字符,然后才能与getc家族的返回值进行比较?

插座打开MacOS组件

函数的限制限定指针参数允许优化调用方函数吗?

I2C外设在单次交易后出现故障

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

在for循环中指向数组开头之前

处理来自浏览器的HTTP请求

Tic-tac-toe:从文件加载存储

将回调/基于事件的C API转换为非回调API

循环中的静态变量与块中的变量和循环

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

隐藏测试用例无法在c程序中计算位数.

被调用方函数内部的C-Struct变量,它是指针还是无关紧要

C中2个数字的加法 - 简单的人类方法

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

是什么阻止编译器优化手写的 memcmp()?