#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <math.h> double AtoF(char * str) { assert(str ); float num1=0; float num2=0; if(*str >='0' && * str<='9' ) //確保第一個字符必須是數字 { while(*str !='.' && * str>='0' && *str<= '9') //處理小數點前面的 { num1=num1*10+* str-'0' ; str++; } if(*str =='.') str++; //處理第一個小數點後面的 int i=1; while(*str !='\0' && * str>='0' && *str<= '9') { num2=num2+(* str-'0' )*(pow(0.1,i)); str++; i++; } //已經走到字符串末尾 if(*str =='\0') return num1+num2; else return 0;; } else return 0; } void test() { char* s1="12.34" ; char* s2="1234" ; char* s3="12.*34" ; //異常 char* s4="12.34.21" ; //異常 char* s5="12%34" ; //異常 char* s6="&12.34" ; //異常 printf( "%f\n",AtoF(s1)); printf( "%f\n",AtoF(s2)); printf( "%f\n",AtoF(s3)); printf( "%f\n",AtoF(s4)); printf( "%f\n",AtoF(s5)); printf( "%f\n",AtoF(s6)); } int main() { test(); system( "pause"); return 0; }
結果:
#include <stdio.h> #include <stdlib.h> //不借瓶子 void test1() { int money=0; scanf( "%d",&money); int bottle=money; int drink=money; while(bottle>1) //剩一個瓶子將陷入死循環 { drink+=bottle/2; bottle=bottle/2+bottle%2; } printf( "%d\n",drink); } //借一個瓶子 void test2() { int money=0; scanf( "%d",&money); int bottle=money; int drink=money; while(bottle) { while(bottle%2==0) //偶數個瓶子 { bottle/=2; drink+=bottle; } while(bottle%2==1) //奇數個瓶子 { bottle+=1; drink+=bottle/2; bottle=bottle/2-1; } } printf( "%d\n",drink); } int main() { test1(); test2(); system( "pause"); return 0; }
結果:
可變參數列表是通過宏來實現的,這些宏定義在stdarg.h頭文件中。這個頭文件聲明瞭一個類型爲va_list的變量和三個宏va_start,va_arg,va_end。我們可以聲明一個類型爲va_list的變量與這幾個宏配合使用,訪問參數的值。
函數先聲明一個va_list的變量,這個變量通過調用va_start來初始化,第一個參數是va_list變量的名字,第二個參數是省略號前的最後一個有名字的參數。
初始化過程把va_list類型的變量設置爲指向可變參數部分的第一個參數。
va_arg宏接受兩個參數:va_list變量和參數列表中下一個參數的類型,返回這個參數的值,並使va_list類型的變量指向下一個可變參數。
當訪問完最後一個可變參數之後,要調用va_end.
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> float Average(int n,...) //n是傳入參數的個數,int是傳入參數的類型 { int count=n ; float sum=0; va_list val; va_start(val,n ); while(count--) { sum+= va_arg(val,int ); } va_end(val); return sum/n ; } void test() { float ave=Average(6,1,2,3,4,5,9); printf( "%f\n",ave); } int main() { test(); system( "pause"); return 0; }
結果:
#include <stdio.h> #include <stdlib.h> #include <string.h> void Reverse_str(char * left,char* right) { while(left <right) { char tmp=*left ; * left=*right ; * right=tmp; left++; right--; } } char* Reverse(char * str) { char* ret=str ; char* start=str ; char* end=str +strlen(str)-1; Reverse_str(start,end); while(*str ) { start= str; while(*str !=' ' && * str!='\0' ) str++; //str==' ' end= str-1; Reverse_str(start,end); if(*str ==' ') str++; } return ret; } void test() { char s[100]="student a am i" ; printf( "%s\n",Reverse(s)); } int main() { test(); system( "pause"); return 0; }
結果:
#include <stdio.h> #include <stdlib.h> unsigned int reverse_bit(unsigned int value ) { unsigned int tmp=0;; unsigned int ret=0; for(int i=1;i<=32;i++) { tmp= value & 1; ret=ret+(tmp<<32-i); value=value >>1; } return ret; } void test() { unsigned int a=25; printf( "%u\n",reverse_bit(a)); } int main() { test(); system( "pause"); return 0; }
結果: