找到一种在 C 中调用具有不同参数的函数的方法

艾萨克101

输入

void sum(int a, int b) {
        a + b;
}

void quit() {
        exit(0);
}

int main() {
    
    char str[10];
    int x, y; 

    printf("Call a function");
    scanf("%s %d %d", str, &x, &y); //<-this is the part I cannot resolve

    //tried to call a function but failed
    if (strcmp(str, "quit") == 0)
          quit();
    else if (strcmp(str, "sum") == 0) 
          sum(x, y);
}

概括:

sum(int a, int b) 和 quit() 函数需要不同的 scanf。如果我想调用一个函数而不考虑参数,我应该如何修复它?我希望程序根据用户输入来识别要调用的函数。

加:该代码仅适用于 sum() 函数,因为 scanf() 仅接受 ["%s %d %d", str, &x, &y] 输入。但是,我希望程序同时扫描 sum() 和 quit() 。

安德烈亚斯·温塞斯劳斯

在处理基于行的用户输入时,总是一次读取一行是有意义的。这不是函数的scanf作用。例如,如果您使用"%s %d %d"格式字符串,scanf则将继续读取输入,直到它能够匹配两个数字,或者直到遇到无法匹配的字符(例如字母字符)。如果用户输入时没有在同一行输入两个数字,它将继续读取行尾的输入"quit",这可能不是您想要的。

为了准确读取一行输入,我建议您使用函数fgets. 然后,如果需要,您可以sscanf在该单行输入上使用。这样,您的程序就不会出现试图读取多行输入的问题。如果用户之后没有输入任何数字,该函数sscanf将简单地报告它只能匹配第一个说明符。

使用函数scanfsscanf,您可以检查函数的返回值以确定匹配格式字符串中的说明符的数量。

scanf使用或sscanf不首先检查该函数的返回值来确定匹配的参数数量是不安全的。否则,您可能正在使用不存在的结果。有关详细信息,请参阅本指南:

远离 scanf() 的初学者指南

此外,当在or (但不是)中使用%s格式说明符时,通常最好限制写入的字符数。否则,如果用户输入超过 9 个字符(包括终止空字符在内的 10 个字符),将发生缓冲区溢出,因为数组只有 10 个字符的空间。应始终防止缓冲区溢出,因为它会导致很难找到的错误。scanfsscanfprintfstr

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

void sum( const int a, const int b )
{
    printf( "The sum of %d and %d is %d.\n", a, b, a + b );
}

void quit()
{
    printf( "Quitting.\n" );
    exit( EXIT_SUCCESS );
}

int main( void )
{
    char line[100];
    char str[10];
    int x, y;
    int num_matched;

    printf( "Call a function: " );
    if ( fgets( line, sizeof line, stdin ) == NULL )
    {
        fprintf( stderr, "Input error!\n" );
        exit( EXIT_FAILURE );
    }

    num_matched = sscanf( line, "%9s %d %d", str, &x, &y );

    if      ( num_matched >= 1 && strcmp( str, "quit" ) == 0 )
        quit();
    else if ( num_matched >= 3 && strcmp( str, "sum"  ) == 0 ) 
        sum( x, y );
    else
        printf( "Bad input!\n" );
}

该程序具有以下行为:

Call a function: sum 5
Bad input!
Call a function: sum 5 7
The sum of 5 and 7 is 12.
Call a function: quit
Quitting.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

寻找一种从C ++调用Java的便捷方法

如何多次模拟具有不同参数的一种方法?

如何忽略Rspec中对具有不同参数的同一方法的某些调用?

试图找到一种构造Julia`generator的方法

C#:是否有一种干净的模式可以找到结合使用的正确对象?

试图找到一种获取Windows路径的快速方法

一种接受不同参数的方法

一种在C中模拟命名参数的方法

有没有一种方法可以将多态函数应用于在Haskell中具有不同参数类型的对象数量?

C ++如何从具有一个参数的派生类构造函数调用具有两个参数的超类构造函数?

C#使用具有不同参数的基类中的方法

如何快速找到一种已经实施的方法?

有没有一种方法可以在C#中的进程ID和名称之上找到一个进程

从C ++ 17中的另一个构造函数调用具有不同参数类型的构造函数

有没有一种方法可以typedef函数来修改C中的参数?

C ++继承重载具有不同参数的函数

找到一种更改节点版本的方法

在c中是否有一种干净的方法可以使一个函数使用不同的参数调用其他函数?

如何实现具有不同参数类型的一种方法?

有没有一种方法可以找到两个C#字符串中最长的字符串的长度?

具有相同内核版本的两种编译:一种引导,一种无法找到根设备

有没有一种方法可以自动找到gdb中方法属于哪个c ++命名空间?

我无法找到一种方法(图片)

在 C++ 中找到一种使用条件提取浮点数的方法

如何使用 C 中的 Unity 单元测试测试具有不同参数的函数?

如何使用`when/then` mockito调用具有相同参数的另一个方法

在 OOP Python tkinter 中的多个类中使用具有相同参数的一个函数的最佳方法是什么

C++ - 可以重载具有不同参数的函数但只定义一次吗?

有没有一种方法可以让函数在 C 中返回指针?