C 如何删除字符串中的元音
我想写一个程序,删除字符串中的元音。这是我目前的代码:C 如何删除字符串中的元音,c,string,C,String,我想写一个程序,删除字符串中的元音。这是我目前的代码: #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')) {
#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;
}
#包括
#包括
空f(字符s[100])
{
int ok=0;
对于(inti=0;i这里的问题是,您正在呼叫
f("alina");
使用字符串文字(“alina”
),该文字通常存在于只读内存中且不可修改。任何修改字符串文字的尝试都将导致未定义的行为
相反,你可以做如下的事情
int main (void)
{
char arr[] = "alina";
f(arr);
return 0;
}
哪个
- 定义一个名为
arr
- 使用值初始化数组
“alina”
- 将数组传递给函数
f()
另外,记下main()
的正确签名这里的问题是,您正在呼叫
f("alina");
使用字符串文字(“alina”
),该文字通常存在于只读内存中且不可修改。任何修改字符串文字的尝试都将导致未定义的行为
相反,你可以做如下的事情
int main (void)
{
char arr[] = "alina";
f(arr);
return 0;
}
哪个
- 定义一个名为
arr
- 使用值初始化数组
“alina”
- 将数组传递给函数
f()
另外,请注意main()
的正确签名程序中有两个主要问题
首先,字符串文字是不可变的。您不能更改字符串文字。任何修改字符串文字的尝试都会导致未定义的行为
其次,当范围相互重叠时,您不能使用strcpy
。您应该使用memmove
而不是strcpy
来自C标准
如果复制发生在重叠的对象之间,该行为是
未定义
而且,总是复制字符串的整个部分以仅删除一个符号是低效的
还声明
printf ("%s",s);
应该从main中的函数中删除。程序中存在两个主要问题
首先,字符串文字是不可变的。您不能更改字符串文字。任何修改字符串文字的尝试都会导致未定义的行为
其次,当范围相互重叠时,您不能使用strcpy
。您应该使用memmove
而不是strcpy
来自C标准
如果复制发生在重叠的对象之间,该行为是
未定义
而且,总是复制字符串的整个部分以仅删除一个符号是低效的
还声明
printf ("%s",s);
应该从main中的函数中删除。对于此问题,您可以使用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;
}
#包括
#包括
char*strip_元音(char*s){
对于(char*p1=s,*p2=s;(*p1=*p2)!='\0';p2++)
p1+=!strhr(“aeiou”、*p1);
返回s;
}
内部主(空){
char msg[]=“你好,世界\n”;
fputs(strip_元音,msg),stdout);
返回0;
}
对于此问题,您可以使用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;
}
#包括
#包括
char*strip_元音(char*s){
对于(char*p1=s,*p2=s;(*p1=*p2)!='\0';p2++)
p1+=!strhr(“aeiou”、*p1);
返回s;
}
内部主(空){
char msg[]=“你好,世界\n”;
fputs(strip_元音,msg),stdout);
返回0;
}
如果你说的是“string literal”而不是“string”,这是对的……但是原始代码和你的代码都传递一个“string”。如果你说的是“string literal”而不是“string”,这是对的……但是原始代码和你的代码都传递一个“string”。