【发布时间】:2019-11-01 09:32:26
【问题描述】:
我正在尝试用 C 语言编写一个带有 2 个参数(char *string_1,char *string_2)的函数,它将所有元音从 string_1 移动到 string_2。我写了一个函数来做到这一点,但输出不是我所期望的。 string_2 的内容似乎很随机,有时还包含非元音。
我编写了一个 while 循环来遍历 string_1,并使用 if 语句检查元音。使用指针,我尝试将 string_2 + i 的内容设置为元音。然后,我将 string_1 中元音所在的位置设为 ' '。我尝试了几种不同的算法,并对其进行了跟踪,但我不确定问题出在哪里。另外,我不允许使用字符串库。任何帮助是极大的赞赏。
#include<stdio.h>
#define MAX_STR_LEN 2048
void moveVowels(char *string_1, char *string_2)
{
int i;
i=0;
while (*(string_1 + i) != '\0')
{
if (*(string_1 + i) == 'a' || *(string_1 + i) == 'A' || *(string_1 +
i) == 'e' || *(string_1 + i) == 'E' || *(string_1 + i) == 'i' ||
*(string_1 + i) == 'I' || *(string_1 + i) == 'o' || *(string_1 + i) ==
'O' || *(string_1 + i) == 'u' || *(string_1 + i) == 'U')
{
*(string_2 + i) = *(string_1 + i);
*(string_1 + i) = ' ';
}
i++;
}
}
int main()
{
char stringy[MAX_STR_LEN]="but they also had a secret, and their greatest
fear";
char vowels[MAX_STR_LEN];
printf("%s\n",stringy);
moveVowels(&stringy[0],&vowels[0]);
printf("%s\n", stringy);
printf("%s\n", vowels);
return 0;
}
预期输出:
but they also had a secret, and their greatest fear
b t th y ls h d s cr t, nd th r gr t st f r
ueaoaaeeaeieaeea
实际输出:
but they also had a secret, and their greatest fear
b t th y ls h d s cr t, nd th r gr t st f r
\u]
【问题讨论】:
-
请不要写
*(pointer+index)。它有一个可读的简写:pointer[index]。 -
你应该这样做
char vowels[MAX_STR_LEN] = {0};否则你不会有一个空终止符 -
还要记住,数组自然会衰减为指向其第一个元素的指针。所以表达式
stringy完全等于&stringy[0]。您使用两者,以及上面提到的显式指针算法。请坚持one一致的风格。这将使您的代码更易于阅读。 -
请注意,您需要跟踪两个不同的索引,而不是索引到具有相同索引的两个数组中。
-
元音数组开头的被初始化为垃圾。比如说,为了论证元音的第一个元素是空终止字符,那么,你什么都不写,因为 stringy 中的第一个字符不是元音。对于 printf,您的 char* 为空。其次,如果您不想在元音中使用空格,则需要另一个索引,而不是 i。三个建议:1. 将数组初始化为零,正如@Gillespie 指出的那样 2. 为元音设置另一个索引,该索引仅针对元音递增,这样您就可以避免空格。
标签: c algorithm pointers c-strings