在C中调用函数

在C中调用函数,c,C,这是我的密码 #include<stdio.h> orders_char(int c1, int c2, int c3); void orders_char(int c1, int c2, int c3) { if(c1 < c2) if(c2 < c3) printf("Ordered characters are: %c %c %c", c1, c2, c3);

这是我的密码

#include<stdio.h>

orders_char(int c1, int c2, int c3);

void orders_char(int c1, int c2, int c3)
{

        if(c1 < c2)
                if(c2 < c3)
                        printf("Ordered characters are: %c %c %c", c1, c2, c3);
                else if(c3 < c2 && c1 < c3)
                        printf("Ordered characters are: %c %c %c", c1, c3, c2);
        else if(c2 < c1
                if(c1 < c3)
                        printf("Ordered characters are: %c %c %c", c2, c1, c3);
                else if(c3 < c1 && c3 < c2)
                        printf("Ordered characters are: %c %c %c", c3, c2, c1);
        else if(c1 > c3)
                if (c3 < c2 && c2 > c1)
                        printf("Ordered characters are: %c %c %c", c3, c1, c2);
                else if(c3 > c2 && c2 < c1)
                        printf("Ordered characters are: %c %c %c", c2, c3, c1);


    return;
}

int main(void)
{

        char c1, c2 ,c3;
        int i = 65;

        printf("Please enter 3 capital letters with no spaces: \n");
        scanf("%c%c%c", &c1, &c2, &c3);
        orders_char(c1, c2, c3);
        return 0;
}
因为没有任何内容,它默认为int

再见, 贝科

编辑:

顺便说一句,你需要一个支架

else if(c2 < c1
else如果(c2
此外,您没有匹配if's-else's。else将始终与附近的if匹配。因此:

if(a>b)
  if(b>c)
    printf("a>b>c");
else
  printf("a<=b");  // <<== wrong! This else matches with if(b>c)
if(a>b)
如果(b>c)
printf(“a>b>c”);
其他的
printf(“ab>c”);
}
其他的
printf(“a我可以看到两个错误:

One:

orders_char(int c1, int c2, int c3);
else if(c2 < c1
应该是

void orders_char(int c1, int c2, int c3);
如果不指定函数的返回类型,编译器将假定
int
。因此,当它看到函数返回
void
时,它会抱怨您无法下定决心

两个:

orders_char(int c1, int c2, int c3);
else if(c2 < c1
else如果(c2
缺少结束页。

右上方:

orders_char(int c1, int c2, int c3);

void orders_char(int c1, int c2, int c3)
{ //...
首先声明然后定义一个函数

但是您的声明缺少返回类型(第一个警告),编译器将默认返回
int
,因此与定义不同(第一个错误)


一般来说,c编译器随后会发出一系列错误消息,因此在读取错误消息时,您应该只查看第一个(或者两个)。

您不需要第三行的orders\u char。这不是一个合适的原型(因为返回类型推断为int)不管怎样,在main()之前,你已经有了函数的完整定义。

你真的应该对
if
表达式使用
{}
。我通过formatter运行了你的代码,它清楚地表明
if
else if
没有按照你希望的方式工作

编辑:

  • 您必须考虑很多情况-这三个变量只有六种可能的排序顺序
  • 您使用int表示字符,但这样做并不好-最好使用
    char
    表示字符

  • 当然,它不会返回任何东西

    您没有满足第一个if条件:

    if (c1 < c2) {
       //all your code is here
    }
    
    if(c1
    无意冒犯,但这是基本的调试技巧。首先检查字符是否按预期输入,可能在调用orders_char()之前使用printf()。其次,您应该使用std::sort()来完成您尝试执行的操作

    std::向量vC; vC.推回(c1); vC.推回(c2); vC.推回(c3); std::sort(vC.begin(),vC.end())

    或者类似的东西。您可以在最喜欢的浏览器中搜索std::sort()


    祝你好运。

    C在比较字符时使用ASCII值。这里有一个像样的ASCII图表:

    sar的值是83,65,82。所以你的第一个if基本上是:

    if (83 < 65)
    

    编辑:我应该说,这可能是不使用内置工具或第三方工具的最直接的方法。显然有比这更快的排序算法。

    更简单的实现:

    #include <stdio.h>
    #include <stdlib.h>
    
    void orders_char (int c1, int c2, int c3);
    
    int compare (const void * a, const void * b)
    {
        return ( *(int*)a - *(int*)b );
    }
    
    void orders_char (int c1, int c2, int c3)
    {
        int a[] = {c1, c2, c3};
        qsort(a, 3, sizeof(int), compare);
        printf("Ordered characters are: %c %c %c\n", a[0], a[1], a[2]);
    }
    
    int main (void)
    {
        char c1, c2, c3;
        int i = 65;
    
        printf("Please enter 3 capital letters with no spaces: \n");
        scanf("%c%c%c", &c1, &c2, &c3);
        orders_char(c1, c2, c3);
        return 0;
    }
    
    #包括
    #包括
    无效命令字符(int c1、int c2、int c3);
    整数比较(常数无效*a,常数无效*b)
    {
    返回(*(int*)a-*(int*)b);
    }
    无效命令字符(int c1、int c2、int c3)
    {
    inta[]={c1,c2,c3};
    qsort(a,3,sizeof(int),比较);
    printf(“有序字符为:%c%c%c\n”、a[0]、a[1]、a[2]);
    }
    内部主(空)
    {
    字符c1、c2、c3;
    int i=65;
    printf(“请输入3个不带空格的大写字母:\n”);
    scanf(“%c%c%c”、&c1、&c2和&c3);
    命令_char(c1、c2、c3);
    返回0;
    }
    
    一般来说,尝试和重建现有的算法是没有意义的。最好立即了解使用哪些算法


    当然,有更好的方法来实现上述功能,但这是非常简单和快速的。

    一个else总是绑定到最接近的前一个不匹配if。缩进并不显示此处实际发生的情况

    if (condition)
        if (condition2)
           Something;
        else if (condition3)
            SomethingElse;
        else if (condition4)
            DoMore;
    
    是代码中实际发生的情况。若要按照您希望的方式工作,您必须这样编写:

    if (condition)
    {
        if (condition2)
           Something;
        else if (condition3)
            SomethingElse;
     }
     else if (condition4)
        DoMore;
    

    当您可以简单地展开冒泡排序时,查找序列的代码似乎相当复杂(而且,在任何人攻击冒泡排序的使用之前,您应该意识到它在某些情况下是完全可以接受的,例如数据已经大部分排序,或者数据集很小的情况下——在这些情况下,它通常会优于其他排序):


    这是一种非常非常糟糕的排序三个字符的方法。最好将它们都放在一个数组中并使用它。这可能是由堆栈溢出造成的。虽然我们愿意提供帮助,但您可能希望从阅读一些开始。我会指出这个非常有用的问题,其中有很多问题。您可以特别关注悬空-else问题。当然,这并不适用,因为原始代码不是这样。有人在大括号中编辑了。问题现在又回到了最初发布的状态。函数的定义在main()之前并不重要,重要的是定义在代码中调用函数之前。
    if (condition)
        if (condition2)
           Something;
        else if (condition3)
            SomethingElse;
        else if (condition4)
            DoMore;
    
    if (condition)
    {
        if (condition2)
           Something;
        else if (condition3)
            SomethingElse;
     }
     else if (condition4)
        DoMore;
    
    #include <stdio.h>
    
    void orders_char(int c1, int c2, int c3) {
        int tmp;
    
        // Unrolled bubble sort for three elements.
    
        if (c1 > c2) { tmp = c1; c1 = c2; c2 = tmp; }
        if (c2 > c3) { tmp = c2; c2 = c3; c3 = tmp; }
        if (c1 > c2) { tmp = c1; c1 = c2; c2 = tmp; }
    
        printf("Ordered characters are: %c %c %c\n", c1, c2, c3);
    }
    
    int main (void) {
        char c1, c2 ,c3;
        printf("Please enter 3 capital letters with no spaces: \n");
        scanf("%c%c%c", &c1, &c2, &c3);
        orders_char(c1, c2, c3);
        return 0;
    }
    
    pax> for i in abc acb bac bca cab cba ; do
    ...>     echo $i | ./sort3
    ...> done
    Ordered characters are: a b c
    Ordered characters are: a b c
    Ordered characters are: a b c
    Ordered characters are: a b c
    Ordered characters are: a b c
    Ordered characters are: a b c