【发布时间】:2018-07-27 01:16:41
【问题描述】:
我在用于简单替换加密的程序中使用以下方法。此方法专门用于去除加解密密钥中的重复字符。
该方法与程序的其余部分一样有效,并且它适用于我尝试过的 99% 的键。但是,当我将密钥 "goodmorning" 或任何由相同字母以任何顺序组成的密钥(例如 "dggimnnooor")传递给它时,它会失败。此外,包含比"goodmorning" 更多字符的键以及具有更少字符的键都有效。
我通过lldb 使用相同的参数运行了可执行文件,它可以工作。我已经在运行 CentOS 的机器上克隆了我的存储库,它按原样运行。
但我在编译时没有收到警告或错误。
//setting the key in main method
char * key;
key = removeDuplicates(argv[2]);
//return 1 if char in word
int targetFound(char * charArr, int num, char target){
int found = 0;
if(strchr(charArr,target))
found = 1;
return found;
}
//remove duplicate chars
char * removeDuplicates(char * word){
char * result;
int len = strlen(word);
result = malloc (len * sizeof(char));
if (result == NULL)
errorHandler(2);
char ch;
int i;
int j;
for( i = 0, j = 0; i < len; i++){
ch = word[i];
if(!targetFound(result, i, ch)){
result[j] = ch;
j++;
}
}
return result;
}
根据请求:如果将"feather" 传递给此函数,则生成的字符串将为"feathr"。
【问题讨论】:
-
显示上下文,你如何称呼它等等。创建一个minimal reproducible example。解释发生了什么,以何种不受欢迎的方式。请。
-
如果没有重复怎么办?您将如何为结果字符串中的字符串终止符留出空间?你在哪里添加终结者?
-
请看链接。
-
这就是 未定义行为 的问题,有时,甚至大部分时间,它似乎都可以正常工作。然后它就在没有警告的情况下中断。不在字符串中放置终止符会导致未定义的行为。
标签: c string undefined-behavior null-terminated