Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C中的char*数组中删除空格_C_Arrays_Char - Fatal编程技术网

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

从C中的char*数组中删除空格,c,arrays,char,C,Arrays,Char,我正在为游戏模拟器开发C中的一个插件,在检查输入消息是否包含任何网站URL之前,我想删除聊天消息中的所有空格 所以,我有这样一个函数来消除空白(从输入消息中删除空格): char*deblank(char*input){ int i,j; 字符*输出=输入; 对于(i=0,j=0;ifd,COLOR\u RED,“检测到可能的GM模拟-您无法在聊天中键入网站URL。”); 返回false; } } 返回返回值; } 上述方法有效,但也有副作用。似乎正在发生的是,当输入消息不包含任何网站URL时

我正在为游戏模拟器开发
C
中的一个插件,在检查输入消息是否包含任何网站URL之前,我想删除聊天消息中的所有空格

所以,我有这样一个函数来消除空白(从输入消息中删除空格):

char*deblank(char*input){
int i,j;
字符*输出=输入;
对于(i=0,j=0;i
我在我的插件挂钩中使用它,如下所示:

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___;
}
bool my\u pc\u process\u chat\u消息(bool retVal\uuuuuu、struct map\u session\u data*sd、const char*消息){
如果(retVal_uuuu==true){
char*check_message=deblank(message);
检测到的bool url=(stristr(检查消息,:/))| stristr(检查消息,www.)| stristr(检查消息,vvvvv.)| stristr(检查消息,wvvw.);
如果检测到(!url_){
int len=sizeof(tld_列表)/sizeof(tld_列表[0]);
int i;
对于(i=0;imessagecolor\u self(sd->fd,COLOR\u RED,“检测到可能的GM模拟-您无法在聊天中键入网站URL。”);
返回false;
}
}
返回返回值;
}
上述方法有效,但也有副作用。似乎正在发生的是,当输入消息不包含任何网站URL时,输入消息被修改,消息中的所有空格被删除

例如,如果我键入:

请访问www.some-domain.com

上面的get被阻止了,这也被阻止了(当玩家试图变得聪明并使用空格时):

w。s o m e-d o m a i n。科尔姆

但是,当您键入不包含任何网站URL的普通邮件时,如下所示:

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___;
}
你好,你好吗

它正在转变为以下内容:

你好,你好吗

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

在进行检查之前,是否有办法临时复制原始的
输入消息
,删除其中的空格


另外,如何清除分配给原始输入临时副本的内存?我不想让这件事久拖不决。或者,当代码在作用域中完成执行后,C是否会自动清除该临时字符数组?

不,实际上不能这样做

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

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
}
  • 分配一个与要修剪的字符串一样大的字符串,并在末尾填充numbytes
i、 e

char*copy\u非空(const char*str)
{
尺寸i;
尺寸j;
char*new=malloc(strlen(str)+1);
对于(i=j=0;i因为(;j代码违反了合同

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

bool my_pc_process_chat_message(..., const char *message) {
  if (retVal___ == true) {
    char* check_message = deblank(message);
正确启用警告功能的编译器将对此发出警告-节省您的时间


有关更多详细信息和想法,请将调用代码发布到
my_pc\u process\u chat\u message()

“已启用警告”??@machine_1 fixedd.Hi,感谢您的解释和代码示例。这现在正按预期工作。虽然它工作正常,但我有两个警告。第一个警告:“嗯,是的,
strlen
返回一个无符号的
size\u t
,而我声明
I j
为整数。如果它们也是
size\u t
最好!(编辑)对于第二个问题:参数没有声明为const,但可以(现在添加)太棒了!谢谢你。最后一个问题。现在这个
check_message
是没有空格的原始消息的副本,这个temp变量的分配内存会发生什么变化?它会在代码块中执行结束时自动清除吗?还是我需要使用
free(check_message)
显式取消分配内存?您需要显式释放内存,因为它是手动释放的。
bool my_pc_process_chat_message(..., const char *message) {
  if (retVal___ == true) {
    char* check_message = deblank(message);