在C中找到第n个事件中的角色

时间:2014-01-10 08:40:03

标签: c

我对下面的代码感到困惑。

#include <stdio.h>
#include <stdlib.h>

int event(char a[],char x,char n);
int main(int argc, char *argv[]) {
    int n,y;
    char a[40],x;
    printf("enter a string\n");
    gets (a);
    printf("enter the character\n");
    x=getche();
    printf("\nenter the event\n");
    scanf("%d",&n);
    y=event(a,x,n);
    if(y==0)
    printf("%dth event not found\n",n);
    else
    printf("%dth event is in position:%d",n,y);
    getch();
    return 0;
}
//*******************************************************
int event(char a[],char x,char n){
    int i,cnt=0;
    for(i=0;a[i];i++){
        if(a[i]==x)
        cnt++;
        if(cnt==n)
        return(i+1);
    }
    return 0;
}

在函数事件中a [],x,n显示为字符,函数为int,但在main函数 n y 是int,当我们调用event时,我们将它们作为int发送。 当我们调用event.why?代码是否正确时,n,y是不同的?

3 个答案:

答案 0 :(得分:3)

  

整数类型或无范围枚举类型的prvalue可以转换为任何其他整数类型。

http://en.cppreference.com/w/cpp/language/implicit_cast#Integral_conversions

char的签名是依赖于实现的

Is char signed or unsigned by default?

由于以下原因:

  

如果目标类型已签名,则如果源整数可以在目标类型中表示,则值不会更改。否则结果是实现定义的。

类型转换的行为特别针对特定于实现。

所以答案可能就是这样。对于n的小值,你可能没问题,但是一旦你遇到截断和签名等等,所有的赌注都会被取消。

答案 1 :(得分:2)

char的范围是-128到127.所以你可以传递一个带有给定范围值的int。如果int的值超出此范围,则会发生溢出并观察到未定义的行为。

知道它是如何工作的 在函数中打印char的值并查看行为。

答案 2 :(得分:0)

在C中,char不是一个(有点奇怪的)整数类型。在调用函数时,参数之间的隐式转换正在发生,一切都按顺序进行。

这种隐式转换只能很好地工作,因为在使用函数之前,已经提供了原型,因此编译器知道参数必须是什么。

char使用x直接向我展示,因为它是一个与a内容进行比较的实体。对n我不认为这是个好主意。通常,大小或索引的所有内容都应使用为此类情况提供的语义类型size_t,无论是main还是event