秒,在解答这个C语言题目上,我们都败了

Posted 嵌入式Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了秒,在解答这个C语言题目上,我们都败了相关的知识,希望对你有一定的参考价值。

看这篇文章之前,我觉得可以先看看下面这篇文章 



不管我们用的printk还是printf,它们的核心都是可变参数的函数,所以可以拼接很多参数传递给函数实体,然后函数实体里面可以通过某种方式解析这些参数。

看看这个题目

过滤一组数据,要求过滤之后头尾部都没有',' ,而且也不能用if 语句来实现。

例如、 输入:a[6]={1,2,3,4,5,6} 输出:1,2,3,4,5,6

使用if 实现之

正常的写法是用到 if 的,已经背离了题目的要求。

不过,我说下自己对这个问题的看法,我们在做项目做需求的时候,产品经理每天拿着刀在后面威逼利诱着,已经是火烧眉毛的事情,能做出对方想要的要求已经是不易了,哪里有时间去思考那些浮夸的写法。

这也是做科研和做项目的不同,我写文章,做分享,是怀着深耕去的,但是做项目,我们是需要把控时间节点的,每个人站在不同的角度,就会看到不同的哈姆雷特。


#include<stdio.h>

int main()
{
    int arr[6] = {1,2,3,4,5,6};
    int is_first = 1;
    int i = 0; 
    for(i = 0; i < 6; i++){
        if(is_first){
            printf("%d",arr[i]);
            is_first = 0;
        }else {
            printf(",%d",arr[i]);
        }
    }
    return 0;
}

大神的写法

这代码来源于知乎的一个题主,他在回答中分享了这个写法,非常巧妙。

#include <stdio.h>
int main(void) {
    int a[6] = {1, 2, 3, 4, 5, 6}, i;
    for (i = 0; i < 6; i++) {
        printf(",%d" + !i, a[i]);
    }
    return 0;
}

https://www.zhihu.com/question/412135686/answer/1396323238

先不解释

我们看看printf函数原型

typedef char *va_list;

#define   _AUPBND        (sizeof (acpi_native_int) - 1)
#define   _ADNBND        (sizeof (acpi_native_int) - 1)

#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap)    (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))

//start.c
static char sprint_buf[1024];
int printf(char *fmt, ...)
{
    va_list args;
    int n;
    va_start(args, fmt);
    n = vsprintf(sprint_buf, fmt, args);
    va_end(args);
    write(stdout, sprint_buf, n);
    return n;
}

里面的几个宏作用我在之前的文章里面也有有提到。

关于va_list ,我写了一个实例,比较简单

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

#include <stdarg.h>

int sum(int size, ...)
{
    va_list vp;
    int s = 0;
    int i = 0;
   
    va_start(vp, size);
    for (i = 0; i < size; ++ i) {
        s += va_arg(vp, int);
        printf("%d\n", s);
    }
    va_end(vp);

    printf("%d,%d\n", size, s);
}

int main()
{
    sum(5, 20, 30, 40, 50, 20);
    return 0;
}

输出

20
50
90
140
160
5,160

--------------------------------
Process exited after 0.08141 seconds with return value 0
请按任意键继续. . .

先举个例子

#include <stdio.h>

int strput(char * str)
{
    printf("%s\n",str);
}

int main()
{
    strput("Linux"+1);
    return 0;
}

输出

inux

--------------------------------
Process exited after 0.08051 seconds with return value 0
请按任意键继续. . .

如果能明白上面的问题这个例子的话,拿对前面那个代码再拿过来瞧瞧,应该就会有一种豁然开朗的感觉了。

#include <stdio.h>
int main(void) {
    int a[6] = {1, 2, 3, 4, 5, 6}, i;
    for (i = 0; i < 6; i++) {
        printf(",%d" + !i, a[i]);
    }
    return 0;
}

首先

",%d" + !i

如果是第一个数组,i 对应的值是 0,所以就不会打印出 「 , 」这个字符了。



  推荐阅读:
    
    
    


嵌入式Linux
微信扫描二维码,关注我的公众号  

以上是关于秒,在解答这个C语言题目上,我们都败了的主要内容,如果未能解决你的问题,请参考以下文章

有秒计时的数字时钟(Java语言)

有秒计时的数字时钟(MOOC面向对象程序设计--Java语言)

C语言秒数转换成标准时间,求解答!

编写C语言程序输出以下图案 ##### **** ### ** #,要有详细过程,悬赏秒结,速来。

求解答c语言结构体定义中typedef的作用

树的子结构