我正在编写一个以这种方式加密给定字符串的程序:
如果我们有一个整数V和一个只有元音的数组v = {a,e,i,o,u}如果字符串的字母是一个元音,那么用它前面的元音替换它的V元素只考虑元音数组(不是整个字母表!)。
要明确:
String: "uuuu" and V:2 -----> String_out: "iiii"
String: "aaaa" and V:2 -----> String_out: "oooo"
String: "iiii" and V:2 -----> String_out: "aaaa"
为了解决我的问题,我写道:
V=2;
char vow[5]={'a','e','i','o','u'};
for(i=0;i<strlen(s);i++){
flag=0;
for(j=0;j<5 && flag==0;j++){
if(*(s+i)==vow[j]){
flag=1;
}
if(flag)
*(s+i)=vow[j-V%5];
}
代码接受字符串的每个元素验证它是否是元音,然后如果它是元音替换字符串的考虑元素与V位置之前的元音。
如果字符串只有元音 i,o,u ,但如果 a,e 输出错误,则此代码有效: 问题
char vow[5]={'a','e','i','o','u'};
j=1 // it will happen if the string is "eeee" in fact corresponds to 'e' in vow
V=2
vow[j-V%5]=... // j-V%5 is a negative number!!!!
那么我如何解决我的问题也是为了字母a和e,以便我不再在誓言中获得负数并且正确地尊重这些抄写规则? 请告诉我是否有事情不清楚,并提前感谢!!!
答案 0 :(得分:1)
我认为对于a和e,你应该环绕所以a-&gt; o和e-&gt; u
更改此
j-V%5
到
((j-V%5) + 5) % 5
示例强>
V=2, j=1
j-V%5 ---------------> -1
(j-V%5) + 5 ---------> 4
((j-V%5) + 5) % 5 ---> 4
Result:
'e' --> 'u'
答案 1 :(得分:1)
如果字符串只有元音i,o,u但是如果它有a,那么输出将是错误的:
这是因为当元音为a
或e
时,j-V%5
为负(因为,j为0
或{ {1}})正如您正确提到的那样。
1
只需使用//when j=0 i.e, vowel `a`
j-V%5 = 0-(2%5) = -2 //`%` has more priority over `-`
//when j=1 i.e, vowel `e`
j-V%5 = 1-(2%5) = -1
来避免(5 + j- (V % 5)) %5
数组的负索引值
vow[]
这有助于避免对//when j=0 i.e, vowel `a`
(5+j- (V%5))%5 = (5+0-(2%5))%5 = 3
//when j=1 i.e, vowel `e`
(5+j- (V%5))%5 = (5+1-(2%5))%5 = 4
//when j=2 i.e, vowel `i`
(5+j- (V%5))%5 = (5+2-(2%5))%5 = 0
//when j=3 i.e, vowel `o`
(5+j- (V%5))%5 = (5+3-(2%5))%5 = 1
//when j=4 i.e, vowel `u`
(5+j- (V%5))%5 = (5+4-(2%5))%5 = 2
数组
另一种方法是,
vow[]
make V
后,V = (V % 5) + 5
作为索引