【问题标题】:What is wrong in my c program to reverse the order of the vowels in a string?在我的 c 程序中颠倒字符串中元音的顺序有什么问题?
【发布时间】:2017-02-03 08:56:11
【问题描述】:
#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”..但它只显示“odica”..我该如何解决这个问题?我的程序需要什么修正?

【问题讨论】:

  • for(i=0;i&lt;=l;i++) --> for(i=0;i&lt;l;i++)
  • 与您的问题无关,但您确实应该实现并使用isvowel 函数;您的代码将大大提高可读性。
  • 请勿编辑问题以删除答案中指出的错误,这会使答案无效。

标签: c arrays string loops


【解决方案1】:

我可以注意到两个错误,

  1. for(i=0;i&lt;=l;i++) 应该是 for(i=0;i&lt;l;i++)。 C 数组使用从 0 开始的索引,因此使用您的代码版本,您将变得与众不同。
  2. 这里不用free(s),它调用undefined behavior,因为s不是内存分配函数返回的指针。

也就是说,我不明白你的逻辑,你从来没有考虑过输入有两个以上的元音。在您的情况下,一旦您击中另一个元音(从后侧计数),您就在执行l = j;,它将外部循环限制设置为找到的另一个元音的位置,因此您会得到截断的输出.

【讨论】:

  • 我用过i
  • Sourav 可能没有看到中间的l = j,我是在重新格式化后才看到的....仍然他的观点既有效又是市长问题。
  • Mhh 添加的部分不正确,他将l 设置为字符串末尾的下一个元音。然后从那里开始下一次迭代。这就是导致他在中间结束字符串的问题
  • @KamiKaze 更改了措辞以避免混淆。谢谢
  • @SouravGhosh 没问题。我的回答有问题吗?因为它以某种方式被忽略并且你得到了赞成?我对其进行了编辑以改进我的措辞,现在也许这会有所帮助。
【解决方案2】:

替换元音后立即设置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()ing 中提到的那样,字符串文字会引发 UB,因此不应该这样做。

【讨论】:

  • @ArijitKarali 支持并标记为答案而不是说谢谢是这里的常见做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多