从C中的char *数组中删除空格

时间:2016-07-23 16:23:01

标签: c arrays char

我正在使用C中的游戏模拟器插件,我想在检查输入消息是否包含任何网站网址之前从聊天消息中删除所有空格。

所以,我有这样的函数deblank(从输入消息中删除空格):

char* deblank(char* input) {
    int i, j;
    char *output = input;
    for (i = 0, j = 0; i < strlen(input); i++, j++) {
        if (input[i] != ' ')
            output[j] = input[i];
        else
            j--;
    }
    output[j] = 0;
    return output;
}

我在我的插件钩子中使用它:

bool my_pc_process_chat_message(bool retVal___, struct map_session_data *sd, const char *message) {
    if (retVal___ == true) {
        char* check_message = deblank(message);
        bool url_detected = (stristr(check_message, "://") || stristr(check_message, "www.") || stristr(check_message, "vvvvvv.") || stristr(check_message, "wvvw."));
        if (!url_detected) {
            int len = sizeof(tld_list) / sizeof(tld_list[0]);
            int i;
            for (i = 0; i < len; ++i) {
                if (stristr(check_message, tld_list[i])) {
                    url_detected = true;
                    break;
                }
            }
        }
        if (url_detected) {
            clif->messagecolor_self(sd->fd, COLOR_RED, "Possible GM Impersonation Detected - you cannot type website URLs in chat.");
            return false;
        }
    }
    return retVal___;
}

以上作品,但有副作用。似乎正在发生的事情是,当输入消息不包含任何网站网址时,输入消息将被修改,并且消息中的所有空格都将被删除。

例如,如果我输入:

  

访问www.some-domain.com

上面的get被阻止,所以这样做(当玩家试图聪明并使用空格时):

   w w w。 s o m e - d o m a i n。 c o m

但是,当您键入不包含任何网站网址的普通邮件时:

  

你好,你好吗?

它变成了以下内容:

  

您好,howareyou?

这是因为这一行:char* check_message = deblank(message); deblank功能似乎正在修改原始消息。我以为该函数会返回一个orignal消息的新副本,没有空格。

在检查之前,有没有办法可以制作原始input message的临时副本,从中删除空格?

另外,如何将分配的内存清除到orignal输入的临时副本?我不想让它留在身边。或者,一旦代码完成在范围内的执行,C是否会自动清除该临时字符数组?

2 个答案:

答案 0 :(得分:1)

不,你实际上不能这样做。

有两种解决方案:   - 第一次循环字符串以计算有多少非空格字符,因此您知道需要分配多少。

int count_not_empty(const char *str)
{
  int n = 0;

  for (; *str; ++str) {
    if (*str != ' ') n++;
  }
  return n + 1; // the +1 is for the nulbyte at the end
}
  • 分配一个与您要修剪的字符串一样大的字符串,并在末尾填充nulbytes。

char *copy_not_empty(const char *str)
{
  size_t i;
  size_t j;
  char *new = malloc(strlen(str) + 1);

  for (i = j = 0; i < strlen(str); ++i)
  {
    if (str[i] != ' ')
      new[j++] = str[i];
  }
  for (; j <= i; j++)
    new[j] = 0; // pad with nulbytes
  return new;
}

答案 1 :(得分:0)

代码违反了合同。

const char *message指向不应修改的数据。 deblank(message)试图修改。它 - &gt;未定义的行为。

bool my_pc_process_chat_message(..., const char *message) {
  if (retVal___ == true) {
    char* check_message = deblank(message);

正确警告启用编译器会发出警告 - 节省您的时间。

有关更多详情和提示,请将调用代码发布到my_pc_process_chat_message()