【他山之石】函数参数不确定的验证


/////////////////单独遗留问题//////////////
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <stdarg.h>


//用来反馈结果
bool    Wifi_ReturnStrings(char *InputString,const char *SplitterChars,uint8_t CountOfParameter)
{
char    arg[CountOfParameter];//居然也可以!!!????????我怎么记得以前是不行的??
printf("%s\n",InputString );
printf("%s\n", SplitterChars);
}

int main(void)
{
char InputString[] = {"hello,iam,gkoson!what,you,name"};

    Wifi_ReturnStrings(  InputString,  "," ,2);

	return 1;
}

规范

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

#ifndef bool
#  define bool  int8_t
#endif

#ifndef false
#  define false     0
#endif

#ifndef true
#  define true      1
#endif

#ifndef NULL
#  define NULL      0
#endif


//用来反馈结果
bool    Wifi_ReturnStrings(char *InputString,const char *SplitterChars,uint8_t CountOfParameter,...)
{
    if (CountOfParameter == 0)
        return false;

    va_list tag;
    va_start(tag, CountOfParameter);
    char *arg[CountOfParameter];//这里居然可以!!!
    for(uint8_t i=0; i<CountOfParameter; i++)
        arg[i] = va_arg (tag, char *);
    va_end(tag);

    char *str;
    str = strtok(InputString, SplitterChars);
    if (str == NULL)
        return false;
    uint8_t i = 0;
    while (str != NULL)
    {
        str = strtok(NULL, SplitterChars);
        if (str != NULL)
            CountOfParameter--;
        strcpy(arg[i], str);
        i++;
        if (CountOfParameter == 0)
        {
            return true;
        }
    }
    return false;
}

int main(void)
{
char InputString[] = {"hello,iam,gkoson!what,you,name"};//不能是指针 需要是数组 因为需要token它 内存切割
char OutputString[2][50]; //用来保存反馈的结果
    Wifi_ReturnStrings(  InputString,  ","  ,2,  OutputString[0],OutputString[1]);
    printf("%s\n",OutputString[0] );
     printf("%s\n",OutputString[1] );
	return 1;
}

bool    Wifi_WaitForString(uint32_t TimeOut_ms,uint8_t *result,uint8_t CountOfParameter,...)
{

    if (result == NULL)
        return false;
    if (CountOfParameter == 0)
        return false;

    *result=0;

    va_list tag;
    char    *arg[CountOfParameter];
    va_start(tag, CountOfParameter);
    for(uint8_t i=0; i<CountOfParameter; i++)
        arg[i] = va_arg (tag, char *);
    va_end(tag);


    //////////////////////////////////
    for (uint32_t t = 0; t < TimeOut_ms; t += 50)
    {
        rt_thread_delay(rt_tick_from_millisecond(50));

        for (uint8_t mx = 0; mx < CountOfParameter; mx++)
        {
            if (strstr((char*) Wifi.RxBuffer, arg[mx]) != NULL)
            {
                *result = mx + 1;
                return true;
            }
        }
    }
    // timeout
    return false;
}

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/89945635