跳至內容

C/常用函數

維基教科書,自由的教學讀本
< C

←回到C


標準I/O

[編輯]

stdio.h中的常用函數。

printf

[編輯]

轉換說明符

轉換說明符 意義 實例 輸出
%a 浮點數、十六進制數字和p-記數法(C99)
%A 浮點數、十六進制數字和P-記數法(C99)
%c 單個字符
%d 有符號十進制數
%e 浮點數、e-記數法
%E 浮點數、E-記數法
%f 浮點數、十進制記數法
%g 根據數值不同自動選擇%f或%e;%e格式在指數小於-4或者大於等於精度時使用
%G 根據數值不同自動選擇%f或%E;%E格式在指數小於-4或者大於等於精度時使用
%i 有符號十進制整數(與%d相同)
%o 無符號八進制整數
%p 指針
%s 字符串
%u 無符號十進制整數
%x 使用十六進制數字(字母小寫)的無符號十六進制整數
%X 使用十六進制數字(字母大寫)的無符號十六進制整數
%% 列印百分號

修飾符

修飾符 意義 實例 輸出
+/- 修飾數字修飾符,表示正負
空格
#
數字 整數部分表示最小欄位寬度,小數部分表示精度
h 表示short,修飾整數表示有符號或無符號短整型
hh 表示short short,修飾整數表示有符號或無符號char型
j 修飾整數表示intmax_t或uintmax_t值
l 表示long,修飾整數表示有符號或無符號長整型
ll 表示long long,修飾整數表示有符號或無符號長長整型
L 表示long,修飾浮點數表示long double值
t 修飾整數表示一個ptrdiff_t值(C99)
z 修飾整數表示一個size_t值(C99)

scanf

[編輯]
#include <stdio.h>
int main(){
    int a,b,c;
    printf("input a,b,c\n");
    scanf("%d%d%d",&a,&b,&c);
    printf("a=%d,b=%d,c=%d",a,b,c);
    return 0;
}

getchar

[編輯]
int getchar(void)
{
  static char buf[BUFSIZ];
  static char* bb = buf;
  static int n = 0;
  if ( n == 0 )
 {
   n = read(0, buf, BUFSIZ);
   bb = buf;
  }
return(--n >= 0) ? (unsigned char)*bb++ : EOF;
}

putchar

[編輯]

gets

[編輯]

puts

[編輯]

puts()函數將一串字符串輸出後換行。

#include <stdio.h>
int mainint argc, char* argv[]
{
    char str[] = "We are same.";
    puts(str);
    printf("%s\n", str );//该语句与上一条语句等效。
}

數學

[編輯]

math.h中的常用函數。

記憶體

[編輯]

realloc

[編輯]
#include <stdio.h>
#include <stdlib.h>
int mainint argc, char* argv[]{
	char *s=NULL, *s_new=NULL;
	int i;

	s=(char*)malloc( 32 );
	bzero( s, 32 );
	strcpy( s, "Hello! world" );
	
	for(i=0;i<100;++i) {
		s_new=(char*)realloc( s, (1+i)*1024 );
		s=s_new;
		strcat( s, " 01234567890");
		printf("%d %s\n", i, s );
	}
	free( s );
}

型態轉換

[編輯]

atoi

[編輯]
#include <stdio.h>
#include <stdlib.h>
int mainint argc, char* argv[]
{
    char str[] = "100";              /* 宣告字串 */
    printf("%d\n", atoi( str ) );    /* 轉換字串為數值, 同理可證 atol, atoll, atof */
}

字串處理

[編輯]

sprintf

[編輯]
int sprintf ( char* str, const char* format, ... );

可以將輸出的字串存取至另一個字串

#include<stdio.h>
#include<string.h>
int main(int argc, char* argv[])
{
    char buffer[50];
    const char str[] = "Jack";
    int n;

    // 輸出 "Hello, my best friend, Jack"
    // 同時將輸出結果存至 buffer,n 值設為 28
    n = sprintf(buffer, "Hello, my best friend, %s.", str);
    
    // 輸出 "[Hello, my best friend, Jack] has 28 characters."
    printf("[%s] has %d characters.", buffer, n);

    return 0;
}

sscanf

[編輯]

strcmp

[編輯]
int strcmp ( const char* str1, const char* str2 );

比較 str1 與 str2 兩字串,若完全相等,則回傳 0。若不相等,則傳回非 0 之值。

#include <stdio.h>
#include <string.h>
int main( int argc, char* argv[] )
{
    // 在 ACSII 中,A 的值(65)小於 B 的值(66),故回傳小於 0 的值
    // 輸出 "strcmp(AA,BB) = -1"
    printf("strcmp(AA,BB) = %d\n", strcmp( "AA", "BB" ) ); 

    // 輸出 "strcmp(BB,AA) = 1"
    printf("strcmp(BB,AA) = %d\n", strcmp( "BB", "AA" ) );

    // 輸出 "strcmp(CC,CC) = 0"
    printf("strcmp(CC,CC) = %d\n", strcmp( "CC", "CC" ) );

    return 0;
}

strcpy

[編輯]

strcat

[編輯]

strlen

[編輯]

strlen()函數返回一個記錄字符串長度(不計入字符串結束符『\0』)的整數。

#include<stdio.h>
#include<string.h>
int mainint argc, char* argv[]
{
    char str[] = "Length";
    printf("%d\n", strlen(str) );//输出6
}

演算法

[編輯]

qsort

[編輯]

標準C函式庫有內建Quick sort演算法,使用時,需傳入比較函數,讓qsort()能作比較。

#include <stdio.h>
#include <stdlib.h>
#define nmemb 7
int compare( const void *a, const void*b ) {
	int *aa=(int*)a, *bb=(int*)b;
	if(*aa>*bb) return 1;
	if(*aa==*bb) return 0;
	if(*aa<*bb) return -1;
}
int mainint argc, char* argv[]{
	int base[nmemb]={ 3, 102, 5, -2, 98, 52, 18};
	int i;
	printf("Original...\n");
	for(i=0;i<nmemb;++i)
		printf"%d \n", base[i];
	qsort( base, nmemb, sizeof(int), compare );
	printf("after qsort...\n");
	for(i=0;i<nmemb;++i) 
		printf"%d \n", base[i];
}