从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);