簡體   English   中英

在我的c程序中,顛倒字符串中元音的順序有什么問題?

[英]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 ...”。我該如何解決這個問題? 我的程序需要什么更正?

我有兩個錯誤,

  1. for(i=0;i<=l;i++)應該是for(i=0;i<l;i++) C數組使用基於0的索引,因此在您的代碼版本中,您將一一對應。
  2. 你不這樣做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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM