作为我学习C的过程的一部分,我正在为字符串操作开发一些函数。其中一个具有替换字符串中的子串的功能,并且提出了一些问题。我在C99工作;在Mac OS Sierra和FreeBSD上进行编译。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *repstr(char input[], char rep[], char new[]) {
char *output = malloc(strlen(input)*5); // <- Question 2
int replen = strlen(rep);
int newlen = strlen(new);
int a, b, c = 0;
// printf("input: %ld\t%s\n", strlen(input), input); // <- Question 1
while(input[a]) {
if(input[(a+b)] == rep[b]) {
if(b == replen - 1) {
strcat(output, new);
a += replen;
c += newlen;
b=0;
}
else b++;
} else {
output[c] = input[a];
a++;
c++;
}
}
return output;
}
int main() {
char buffer[] = "This is the test string test string test test string!";
char rep[] = "test";
char new[] = "tested";
int len = strlen(buffer);
char output[len+5];
printf("input: %d\t%s\n", len, buffer); // <- Question 1
strcpy(output, repstr(buffer, rep, new));
printf("output: %ld\t%s\n", strlen(output), output);
return 0;
}
问题1:当在main()中执行此行时,会导致段错误。但是,在函数内执行时,一切似乎都能正常工作。为什么呢?
问题2:我意识到我需要为输出分配一大块内存,以便按预期显示。 strlen(输入)* 5是一个似乎有用的任意数字,但为什么我看似随机&#39;降低数量时的错误?
NB!由于这是我在CI中学习编码的过程的一部分,我并不主要感兴趣的(更有效的)预制解决方案来解决问题(已经有它们),但要解释列出的两个问题 - 这样我就可以解决问题本身。
也;这是我在SO论坛上的第一篇文章。你好。
答案 0 :(得分:1)
问题1:当在main()中执行此行时,会导致段错误。 但是,当在函数内执行时,一切似乎都有效 精细。为什么呢?
不,printf("input: %d\t%s\n", len, buffer); // <- Question 1
不是您的段错误的原因。
printf("output: %ld\t%s\n", strlen(output), output);
此部分是,strlen
不会返回int
,但会返回size_t
。如评论中所述,请使用%zu
将其打印出来。
此外,while(input[a])
将停止在NULL终止符处,这意味着您的output
将永远不会持有终结符,因此printf
将继续阅读,您应该在最后添加它:
output[c] = '\0';
同样,正如评论中@LPs所指出的那样,你应该初始化你使用的变量:
int a = 0, b = 0, c = 0;
问题2:我意识到我需要一块相当大的内存 分配给输出看起来像预期的那样。 strlen(输入)* 5是一个 似乎有效的任意数字,但为什么我看起来似乎 降低数量时出现“随机”错误?
可能是因为你没有分配足够的内存。因为字符串长度取决于运行时因素,所以无法知道您应该分配所需的最大数量所需的确切内存:
char *output = malloc(strlen(input) * strlen(new) + 1);