我正在尝试编写一个从字符串src中删除char c的函数,当我尝试运行它时,我遇到了一个seg错误。这是功能。
void removeChar(char *src, char c){
int i, j = 0;
int size;
char ch1;
char str1[100];
size = strlen(src);
for (i = 0; i < size; i++){
if (src[i] != c){
ch1 = src[i];
str1[j] = ch1;
j++;
}
}
str1[j] = '\0';
src = str1;
}
这是我称之为的主要功能。
int main(int argc, char **argv){
char *str = "Hello, world!\0";
printf("%s\n", removeChar(str, 'l'));
}
答案 0 :(得分:2)
此函数removeChar(str, 'l')
的返回类型为void而不是char数组,并且您将其传递给
printf(&#34;%s \ n&#34;,removeChar(str,&#39; l&#39;));
所以这里%s可能会给你分段错误。
答案 1 :(得分:2)
您通过本地数组的第一个元素的地址
分配了指针src src = str1;
退出函数后将被销毁。此外,变量src是函数的局部变量,因此它的任何更改都不会影响原始指针str。
考虑到您可能不会更改字符串文字。任何更改字符串文字的尝试都会导致程序的未定义行为。
此函数的返回类型为void,并且不能用作函数printf中的输出对象。
类型void
是不完整的类型。它没有价值。
并且不需要像你那样将字符串文字明确地终止为零。
"Hello, world!\0"
字符串文字已经有终止零。所以你可以简单地写一下
"Hello, world!"
由于我已经回答了这个问题,你可以访问my personal forum,其中有相应的有效功能。
如果要正确声明像
这样的功能char * removeChar( char *s, char c );
然后主要看起来如下
int main(int argc, char **argv)
{
char str[] = "Hello, world!";
printf( "%s\n", removeChar( str, 'l' ) );
}
答案 2 :(得分:1)
您可以在函数本身中打印字符串!然后它工作:
#include <stdio.h>
#include <string.h>
void removeChar(char src[], char c){
int i, j = 0;
int size;
char ch1;
char str1[100];
size = strlen(src);
for (i = 0; i < size; i++) {
if (src[i] != c) {
ch1 = src[i];
str1[j] = ch1;
j++;
}
}
str1[j] = '\0';
src = str1;
printf("%s\n", src);
}
int main(int argc, char **argv) {
char str[] = "Hello, world!";
removeChar(str, 'l');
return 0;
}
答案 3 :(得分:1)
你有几个错误:
char *str = "Hello, world!\0";
。设置指向字符串文字的非常量指针总是错误的。相反,将变量声明为const char *str
。请参阅此FAQ。
removeChar不会返回任何内容,因此您无法将其作为printf打印的参数传递。你的编译器真的应该在这里抱怨。有可能是您的编译器配置错误,或者您在启用所有警告的情况下都没有使用它。
char str1[100];
您无法使用局部变量,然后尝试将内容传递给调用者。请参阅此FAQ。
src = str1;
没有做任何事情,因为src
只是原始指针的本地副本。通过此分配,您不会更改main中str
的地址。无论如何,这将是一个错误,因为上面的3)。您应该重写您的程序,以便只使用src
而不使用临时数组。
答案 4 :(得分:0)
没有足够的声誉来发表评论。所以,我不得不写下这个回答:
来自莫斯科的Vlad 指出,
`a local array do not exist after the function terminate`
我建议你遵循与标准库函数相同的原则。如果您还没有注意到,则没有 string.h 函数为用户分配内存。您必须在致电前分配。
char *str = "Hello, world!\0";
上述代码不保证可修改的内存。编译器可以将它们设置在只读存储器中。你应该使用数组。