Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf函数内部返回值(或其他函数)_C_Input_Type Conversion_Scanf - Fatal编程技术网

scanf函数内部返回值(或其他函数)

scanf函数内部返回值(或其他函数),c,input,type-conversion,scanf,C,Input,Type Conversion,Scanf,所以我打算在一个无限循环中运行一个函数,它接受一个数字输入,但我记得我没有这样做 while (true) { myfunc(scanf("%d)); } 因为我需要将scanf输入放入一个变量中。我不能执行scanf(%*d),因为它根本不返回值。我不想非得这么做 int temp; while (true) { scanf("%d", &temp); myfunc(temp); 或者包括更多的图书馆。有没有像gets这样的标准

所以我打算在一个无限循环中运行一个函数,它接受一个数字输入,但我记得我没有这样做

while (true) {
    myfunc(scanf("%d));
}
因为我需要将scanf输入放入一个变量中。我不能执行
scanf(%*d)
,因为它根本不返回值。我不想非得这么做

int temp;
while (true) {
    scanf("%d", &temp);
    myfunc(temp);
或者包括更多的图书馆。有没有像gets这样的标准单函数(I cod do
myfunc((int)strtol(gets(),(char**)NULL,10));
但是它有点乱

如果我要求太多或太迂腐,我应该这么做^

顺便问一下,有没有办法将字符串声明为int,或者更好的方法是,使用一个函数将int转换为string?我通常使用

//num is some number
char* str = (char*) malloc(12);
sprintf(str, "%d", num);
func(str);

但是wodnt
func(str(num))更简单?

对于初学者来说,
scanf
(和类似函数)的返回值是发生的转换次数。该返回值还用于指示是否发生错误

在C语言中,您必须手动管理这些错误

if ((retv = scanf("%d", &n)) != 1) {
    /* Something went wrong. */
}
您似乎在寻找高级语言中的便利。使用垃圾收集策略、异常网络(
try..catch
)等可以隐藏细节的语言和运行时。C不是那种语言,因为按照今天的标准,它是一种相当低级的语言。如果你想要“不乱”的函数,你必须从头开始构建它们,但是你必须决定你可以接受什么样的折衷

例如,您可能需要一个简单的函数,它只从用户那里获取一个
int
。您可以做的一个折衷是,它只会在任何错误上返回
0
,以换取永远不知道这是错误还是用户实际输入了
0

int getint(void) {
    int n;

    if (scanf("%d", &n) != 1)
        return 0;

    return n;
}
这意味着,如果用户输入错误,您将无法重试,程序必须继续运行

这种幼稚的方法不能很好地扩展,因为您必须手动管理C中的内存。这取决于您如何
释放
动态分配的任何内存

您当然可以编写一个简单的函数,如

char *itostr(int n) {
    char *r = malloc(12);

    if (r && sprintf(r, "%d", n) < 1) {
        r[0] = '0';
        r[1] = '\0';
    }

    return r;
}
char*itostr(int n){
char*r=malloc(12);
if(r&&sprintf(r,“%d”,n)<1){
r[0]=“0”;
r[1]='\0';
}
返回r;
}
哪一个进行的错误检查最少(同样,我们不知道
“0”
是错误还是有效输入)

当您编写类似
func(itostr(51))
,除非预期
func
释放其参数(这将排除传递非动态分配的字符串),否则此模式将不断泄漏内存


因此,没有真正的“简单”方法来做这些事情。如果你想构建任何复杂的东西,你必须变得“凌乱”(处理错误、管理内存等)。

第二块代码就是你需要做的。op,为什么你不想像第二块代码那样做呢?将代码压缩成一行并不一定会让它更具可读性。编写一个这样做的函数,然后在一行中调用该函数。这就是为什么将代码放在函数中是一个好主意。你可以把所有的错误检查都放在那里,并且仍然有一个单线通话。