[英]What is wrong in my c program to reverse the order of the vowels in a string?
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
system("clear");
char* s = "education";
int l = strlen(s);
int i, j;
for (i = 0; i < l; i++)
{
printf("%c", s[i]);
}
printf("\n");
for (i = 0; i <= l; i++)
{
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u'
|| s[i] == 'A' || s[i] == 'E' || s[i] == 'O' || s[i] == 'I' || s[i] == 'U')
{
for (j = l - 1; j >= 0; j--)
{
if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u'
|| s[j] == 'A' || s[j] == 'E' || s[j] == 'O' || s[j] == 'I' || s[j] == 'U')
{
printf("%c", s[j]);
l = j;
break;
}
}
}
else
{
printf("%c", s[i]);
}
}
free(s);
getch();
return 0;
}
該程序將打印一個給定的字符串,其元音順序顛倒..假設字符串為“ hello” ..輸出將為“ holle”。 該程序應該給出一個輸出“ odicatuen” ..但是它只顯示最多“ odicatu ...”。我該如何解決這個問題? 我的程序需要什么更正?
我有兩個錯誤,
for(i=0;i<=l;i++)
應該是for(i=0;i<l;i++)
。 C數組使用基於0的索引,因此在您的代碼版本中,您將一一對應。 free(s)
在這里,它調用未定義的行為作為s
是不是內存分配函數返回一個指針。 就是說,我不明白您的邏輯,您從未考慮過輸入具有兩個以上的元音。 在您的情況下,一旦您碰到了另一個元音(從后側算起),您就在做l = j;
它將外部循環限制設置為找到的另一個元音的位置,因此您會得到該截斷的輸出。
替換元音后立即設置l = j
。 這樣可以減少字符串的“已知長度”,並且一擊到中間,您的l
就會比外循環i
迭代器小。 所以你退出循環
您必須添加另一個變量來跟蹤內部循環中的進度,而不是為此使用字符串的長度。
同樣,您應該讓for循環計數到數組長度以下,因為c數組從0開始。
int l1 = l;
for (i = 0; i < l; i++)
{
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u'
|| s[i] == 'A' || s[i] == 'E' || s[i] == 'O' || s[i] == 'I' || s[i] == 'U')
{
for (j = l1 - 1; j >= 0; j--)
{
if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u'
|| s[j] == 'A' || s[j] == 'E' || s[j] == 'O' || s[j] == 'I' || s[j] == 'U')
{
printf("%c", s[j]);
l1 = j;
break;
}
}
}
else
{
printf("%c", s[i]);
}
}
正如Sourav在他的free()
答案中提到的那樣,字符串文字會引起UB,因此不應這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.