【问题标题】:Returning a value with pointer ( C program)用指针返回一个值(C程序)
【发布时间】:2018-08-23 00:22:59
【问题描述】:

我是 C 的初学者,下面是一个查找给定数字位置的程序。我的第一个函数有效,但我不能说第二个(digitPos2)从指针返回值。我不确定哪里出了问题以及为什么。

#include <stdio.h>
int digitPos1(int num, int digit);
void digitPos2(int num, int digit, int *result);
int main()
{
 int number, digit, result=0;
 printf("Enter the number: \n");
 scanf("%d", &number);
 printf("Enter the digit: \n");
 scanf("%d", &digit);
 printf("digitPos1(): %d\n", digitPos1(number, digit));
 digitPos2(number, digit, &result);
 printf("digitPos2(): %d\n", result);
 main();//return 0;
}
int digitPos1(int num, int digit)
{
    int pos=0;
    while(num)
    {
        if(num%10 == digit)
        {
            return pos = pos + 1;
        }
        else
        {
            pos++;
            num = num/10;
        }
    }
}
void digitPos2(int num, int digit, int *result)
{
    int pos=0;
    while(num)
    {
        if(num%10 == digit)
        {
            pos = pos + 1;
            *result = pos;
        }
        else
        {
            pos++;
            num = num/10;
        }
    }
    *result = 0;
}

Output

【问题讨论】:

  • break whileif 的情况下没有循环-> 无限循环
  • return pos = pos + 1; -> return pos + 1; 会更好
  • digitPos1 -> 可以不使用return退出这个函数
  • @Ley Clo 你是从数字的右侧从数字的左侧看位置吗?

标签: c algorithm function while-loop do-while


【解决方案1】:

这两个函数都无效。

对于初学者来说,最好将参数numdigit 设置为具有unsigned int 类型。否则功能会更复杂。也就是说,您需要检查参数之一或两者是否为负。

其次,函数digitPos1 具有未定义的行为,因为如果数字中不存在数字,它不会返回任何内容。

此外,您应该使用 do-while 循环而不是 while 循环,因为用户可以将 num 设置为 0,而 0 是一个有效数字。

函数digitPos2中的这条语句

*result = 0;

没有意义。

如果找到数字,则必须退出该功能

while(num)
{
    if(num%10 == digit)
    {
        pos = pos + 1;
        *result = pos;
        // exit the function
    }
    //...

还不清楚用户如何确定数字中是否不存在数字。

如果数字中不存在数字,您可以使用返回 -1 的方法。

注意,根据 C 标准,不带参数的函数main 应声明为

int main( void )        

这是一个演示程序

#include <stdio.h>

int digitPos1( unsigned int num, unsigned int digit);
void digitPos2( unsigned int num, unsigned int digit, int *result);

int main( void )
{
    unsigned int number, digit;
    int result;

    printf( "Enter the number: " );
    scanf( "%d", &number );

    printf( "Enter the digit: " );
    scanf( "%d", &digit );

    printf("digitPos1(): %d\n", digitPos1( number, digit ) );

    digitPos2(number, digit, &result);
    printf( "digitPos2(): %d\n", result );

    return 0;
}

int digitPos1( unsigned int num, unsigned int digit )
{
    const unsigned int Base = 10;
    int pos = -1;
    int n = 0;

    do
    {
        if ( num % Base == digit )
        {
            pos = n;        
        }
        else
        {
            ++n;
        }

    } while ( ( num /= Base ) && ( pos == -1 ) );

    return pos;
}

void digitPos2( unsigned int num, unsigned int digit, int *result )
{
    const unsigned int Base = 10;
    int n = 0;

    *result = -1;
    do
    {
        if ( num % Base == digit )
        {
            *result = n;        
        }
        else
        {
            ++n;
        }

    } while ( ( num /= Base ) && ( *result == -1 ) );
}

程序输出可能看起来像

Enter the number: 123456
Enter the digit: 2
digitPos1(): 4
digitPos2(): 4

位置从0开始。

【讨论】:

    【解决方案2】:

    首先, 如果数字根本不存在,您应该返回一个实数中不可能的索引,例如在这种情况下,您可以返回一个负数,可能是-1。 (在 c/c++ 中,索引从 0 开始,因此 0 始终是有效索引)

    所以digitPos1(int num, int digit) 的结尾应该是这样的

    while(num){
        //your code
        //return pos + 1 in case digit found
        //more code
    }
    return -1;
    

    对于digitPos2(int num, int digit, int *result) 类似,您应该使用-1 初始化*result

    int pos=0;
    *result = -1;
    

    最大的错误是在末尾设置*result=0。要理解这一点,您应该了解,在处理指针时,您对指针值所做的每一次更改也会反映在被调用函数中,因此如果您设置 *result=0,那么之前的所有计算都将被浪费,并且位置会被盲目地返回为0。因此,您必须删除此行,以便您的计算反映在主函数中。

    其次, 我认为您没有考虑过重复的情况,例如

    num : 1232323
    digit : 3 
    

    在这里,理想情况下,如果digitPos2,您应该在找到匹配项后中断或返回

    *result = pos;
    return; //return type is void
    

    根据我的说法,这种变化应该会产生预期的行为。

    【讨论】:

      猜你喜欢
      • 2013-05-25
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 2013-11-06
      相关资源
      最近更新 更多