我想编写一个程序来删除字符串中的元音。到目前为止,这是我的代码:
#include <stdio.h>
#include <string.h>
void f (char s[100])
{
int ok=0;
for (int i=0; i<strlen(s); i++)
{
if ((s[i]=='a')||(s[i]=='e')||(s[i]=='i')||(s[i]=='o')||(s[i]=='u'))
{
ok++;
strcpy (s+i,s+i+1);
}
}
printf ("%s",s);
}
int main ()
{
f("alina");
return 0;
}
当我编译它时,我的程序停止工作。当我调试它时会发生同样的情况:当我到达行strcpy (s+i,s+i+1);
时,我收到一条错误消息:&#34;程序已停止工作&#34;。难道我做错了什么?我错过了什么吗?
答案 0 :(得分:3)
问题在于,您正在调用
f("alina");
带有字符串文字("alina"
),它通常出现在只读内存中,不可修改。任何修改字符串文字的尝试都将导致未定义的行为。
相反,您可以执行类似
的操作int main (void)
{
char arr[] = "alina";
f(arr);
return 0;
}
其中
arr
"alina"
f()
。另外,请记下main()
的正确签名。
答案 1 :(得分:1)
您的计划有两个主要问题。
首先,字符串文字是不可变的。您可能无法更改字符串文字。任何修改字符串文字的尝试都会导致未定义的行为。
其次,当范围相互重叠时,您可能不会使用strcpy
。您应该使用strcpy
memmove
来自C标准
如果在重叠的对象之间进行复制,行为就是 未定义强>
要始终复制字符串的整个部分以仅删除一个符号效率低下。
同样声明
printf ("%s",s);
应该从main中的函数移动。
答案 2 :(得分:1)
对于这个问题,你可以使用twix技巧,又称双指法:
#include <stdio.h>
#include <string.h>
char *strip_vowels(char *s) {
for (char *p1 = s, *p2 = s; (*p1 = *p2) != '\0'; p2++)
p1 += !strchr("aeiou", *p1);
return s;
}
int main(void) {
char msg[] = "Hello world\n";
fputs(strip_vowels(msg), stdout);
return 0;
}