⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printf.c

📁 M16C瑞萨平台
💻 C
📖 第 1 页 / 共 2 页
字号:
    s1[cntr]='\0';
    _strrev(s1);
    _puts(s1);
    (*cntr_val)+=_strlen(s1);
  }

  /*************** Floating Point Support *****************/
  void float_print(long double f1,long double f2,int multi,int *cntr_val) {
    int i=1,temp,cntr=0,i1,neg_flag=0;
    char s1[10];

    if(f1<0){
      f1=f1*-1;
      neg_flag=1;
      f2=f1;
    }
    temp=(int)f1;

    f1=f1-temp;
    f1=f1*multi;

    temp=f1;

    if(temp==0)
      s1[cntr++]='0';
    while(temp>0){
      i1=temp%10;
      temp=temp/10;
      s1[cntr]=i1+0x30;
      cntr++;
    }

    while(right_val<9&&(right_val -cntr)>0)
      s1[cntr++]='0';
    s1[cntr]='.';
    cntr++;

    temp=(int)f2;
    if(temp==0)
      s1[cntr++]='0';
    while(temp>0){
      i1=temp%10;
      temp=temp/10;
      s1[cntr]=i1+0x30;
      cntr++;
    }

    while(left_val-- -cntr>0){
      _putchar(' ');
      (*cntr_val)++;
    }
    if(neg_flag==1)
      s1[cntr++]='-';
    s1[cntr]='\0';
    cntr--;
    _strrev(s1);
    _puts(s1);
    (*cntr_val)+=_strlen(s1);
    neg_flag=0;
  }

  /*************** Format Values *****************/
  int format_val(char *temp,long float_flag,int *cntr_val,int flag) {
    left_val=0;
    right_val=0;
    if(*temp=='\0'&&flag==1) {
      right_val=3;
      return 0;
    }

    while(*temp!='.'&&*temp!='\0') {
      if(*temp<'0'||*temp>'9')
      {
        while(*temp)
        {
	    _putchar(*temp++);
	    (*cntr_val)++;
        }
        return -1;
      }
      else
        left_val=left_val*10+*temp-'0';
      temp++;
    }
      if(*temp)
        temp++;
      else
        return left_val;
      while(*temp) {
        if(*temp<'0'||*temp>'9')
        {
          while(*temp)
          {
	      _putchar(*temp++);
	      (*cntr_val)++;
          }
        return -1;
        }
        else
          right_val=right_val*10+*temp-'0';
      temp++;
    }

    return 0;
  }

  /*************** Printf(arguments) *****************/
  int _printf(const char * format, ...) {
    int format_cntr=0;
    char temp_str[20];
    int return_flag=0,cntr_val;
    long double f1,f2;
    char *str_temp;
    int *cntr=&cntr_val;

    va_list ap;
    va_start(ap, format);
    *cntr=0;

    while(*format) {
      if(*format=='\n') {
        _putchar('\r');
   	  }

      temp_str[format_cntr]='\0';
      if(*format=='%') {
        *format++;
        while(*format==' ') {
	      format++;
	      _putchar(' ');
        }

        while(condition){
	      temp_str[format_cntr++]=*format++;
        }
        temp_str[format_cntr]='\0';
        if(*format=='%') {
	      _putchar('%');
	      (*cntr)++;
	      format_cntr=0;
	      format++;
	      continue;
        }
        /************** Printf Unsigned ****************/
        else if(*format=='u'){
	    return_flag=format_val(temp_str,0,cntr,0);
	      if(return_flag!=-1)
	      print_hex_oct(va_arg(ap,unsigned int),10,0,return_flag,0,cntr);
	      else {
	        _putchar(*format);
	        (*cntr)++;
	      }
	    format++;
	    format_cntr=0;
	    continue;
        }
	    /*********** Printf Integer **************/
        else if(*format=='d'||*format=='i') {
	      return_flag=format_val(temp_str,0,cntr,0);

	      if(return_flag!=-1){
	      print_hex_oct(va_arg(ap,int),10,0,return_flag,1,cntr);
	      }
	      else {
	        _putchar(*format);
	        (*cntr)++;
	      }
	    format++;
	    format_cntr=0;
	    continue;
        }

        /*********** Printf Hexadecimal, Octal ******************/
        else if(*format=='x'||*format=='X'||*format=='o'||*format=='p') {
	      return_flag=format_val(temp_str,0,cntr,0);
	      if(return_flag!=-1) {
	        if(*format=='x'||*format=='p')
	          print_hex_oct(va_arg(ap,unsigned int),16,0x60,return_flag,0,cntr);
	        else if(*format=='X')
	        print_hex_oct(va_arg(ap,unsigned int),16,0x40,return_flag,0,cntr);
	        else
	          print_hex_oct(va_arg(ap,unsigned int),8,0,return_flag,0,cntr);
	      }
	      else {
	        _putchar(*format);
	        (*cntr)++;
	      }
	      format++;
	      format_cntr=0;
	      continue;
        }
        /************ Printf Character *******************/

        else if(*format=='c') {
          return_flag=format_val(temp_str,0,cntr,0);
	      if(return_flag!=-1) {
	        while(return_flag-->1) {
	          _putchar(' ');
	         (*cntr)++;
	        }
	      _putchar(va_arg(ap,int));
	      (*cntr)+=2;
	      }
	      else {
	        _putchar(*format);
	        (*cntr)++;
	      }
	    format++;
	    format_cntr=0;
	    continue;
        }

        /*************** Printf String *****************/
        else if(*format=='s') {
          return_flag=format_val(temp_str,0,cntr,0);
	      if(return_flag!=-1) {
	        str_temp=va_arg(ap,char*);
 	        while((return_flag--  -(int) _strlen(str_temp))>0) {
	          _putchar(' ');
	         (*cntr)++;
 	        }
	      _puts(str_temp);
	      (*cntr)+=_strlen(str_temp);
	      }
	      else {
	        _putchar(*format);
	        (*cntr)++;
	      }
	    format++;
	    format_cntr=0;
	    continue;
        }
        /*************** Printf Floating Point Number *****************/
        else if(*format=='f'||(*format=='l'&&*(format+1)=='f')) {
          return_flag=format_val(temp_str,1,cntr,1);
	      if(return_flag!=-1) {
	        if(*format=='l') {
	          f1=va_arg(ap,long double);
	          format+=2;
	        }
	        else {
	          f1=va_arg(ap,double);
	          format++;
	        }
	        f2=f1;

	        right_val++;
	        float_print(f1,f2,temp_arr[right_val%10],cntr);

	      }
	      else {
	        _putchar(*format++);
	        (*cntr)++;
	      }
	      format_cntr=0;
	      continue;
        }

	    else if(*format=='l'&&((*(format+1)=='d')||(*(format+1)=='u'))) {
          return_flag=format_val(temp_str,0,cntr,0);

	      if((return_flag=-1)&&(*(format+1)=='d')) {
	        print_hex_oct(va_arg(ap,long int),10,0x00,return_flag,1,cntr);
	      }
	      else if((return_flag=-1)&&(*(format+1)=='u')) {
	        print_hex_oct(va_arg(ap,unsigned long int),10,0x00,return_flag,0,cntr);
	      }

	      else {
	        _putchar(*format);
	        _putchar(*(format+1));
	        (*cntr)+=2;
	      }
	      format+=2;
	      format_cntr=0;
	      continue;
        }
        else {
          _puts(temp_str);
	      format_cntr=0;
	      continue;
        }
      }
      _putchar(*format++);

      (*cntr)++;
    }
    va_end(ap);
    return cntr_val;
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -