我目前正在开发一个小程序,该程序需要一个函数来返回字符串(字符数组)和两个参数(phrase,c)。 “短语”是字符串输入,“ c”是将从短语中删除的字符。剩余的空格也将被删除。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//This method has two parameters: (str, c)
//It will remove all occurences of var 'c'
//inside of 'str'
char * rmchr(char * str, char *c) {
//Declare result array
char *strVal = (char *) malloc(sizeof(char) * strlen(str));
//Iterate through each character
for (int i = 0; i < strlen(str); i++) {
*(strVal+i) = str[i];
//Check if char matches 'c'
if (strVal[i] != *c){
//Assign filtered value to new array
*(strVal+i) = str[i];
printf("%c", strVal[i]);
}
}
return strVal;
}
int main()
{
char * result = rmchr("This is a great message to test with! It includes a lot of examples!","i");
return 1;
}
在'rmchr'函数(如果声明)内,该数组精确地打印出我想要返回的方式:
Ths s a great message to test wth! It ncludes a lot of examples!
问题是我的返回变量'strVal'没有在if语句之外修改。如何永久修改数组,以便理想的输出返回到“结果”内部(在main内部)。
答案 0 :(得分:0)
我看到一些要解决的问题。基本上,此代码直接按原样直接复制输入字符串。相同的*(strVal+i) = str[i];
分配在代码中的两个位置发生,而忽略了与*c
的比较。如果没有一些二级索引变量j
,就很难跟踪接收字符串的结尾。
其他说明:
您的free
没有malloc
;这会造成内存泄漏。
您返回退出代码1
,该退出代码表示程序异常终止。 return 0
表示正常退出。
不强制转换指针malloc
返回;这样可以隐藏错误。
验证malloc
成功,如果失败则退出。
strlen()
是一个线性时间操作,它会在每次调用时遍历整个参数字符串。调用一次并将结果存储在变量中以节省周期。
此代码无法按要求处理多余的空格。
请参阅以下示例,以解决上述问题:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *rmchr(char *str, char *c) {
int i = 0;
int j = 0;
int len = strlen(str);
char *result = malloc(sizeof(*result) * (len + 1));
if (result == NULL) {
fprintf(stderr, "out of memory\n");
exit(1);
}
while (i < len) {
if (str[i] != *c) {
result[j++] = str[i++];
}
else {
for (i++; i < len && str[i] == ' '; i++);
}
}
result[j] = '\0';
return result;
}
int main() {
char *result = rmchr("This is a great message to test with! It includes a lot of examples!", "i");
for (int i = 0; i < strlen(result); i++) {
printf("%c", result[i]);
}
free(result);
return 0;
}
输出:
Ths s a great message to test wth! It ncludes a lot of examples!
还有一个repl。