C言語の可変パラメータと文字の入出力

3203 ワード

一.可変パラメータの処理
プログラムを書くとき、入力されたパラメータが確定している場合は、順番に処理すればいいです.パラメータの長さが不確定な場合、どのように処理しますか?
Cでは、伝達関数のすべての実パラメータのタイプと数をリストできない場合、パラメータテーブルを省略記号で指定できます.例えばvoid func(...)
また、C言語は標準的な処理方法を提供しています.
まず次の例を見てみましょう.(この関数は、不定長の文字を出力することを実現します)
#include "stdarg.h"

void Dug_Printf(const char *fmt, ...)
{
    va_list args; 
    va_start(args, fmt); 
    vprintf(fmt, args); 
    va_end(args); 
    fflush(stdout);
}

各セグメントのコードの意味を一歩一歩分析します.
(1)まずva_を定義するlist型の変数で、この変数はパラメータを指すポインタ、つまりパラメータリストの「...」;VA_LISTはC言語における変参問題を解決するマクロのセットである.
(2)va_start(args, fmt); およびva_end(args); グループです.前者は定義されたパラメータを初期化し、可変パラメータテーブルの最初のパラメータを指す.後者は、すべてのパラメータを取得した後、定義したパラメータポインタをオフにして、危険が発生しないようにします.
(3)vprintfの役割は,可変パラメータリストのフォーマットデータをstdoutに印刷することである.
(4)fflush(stdout):出力バッファを空にし、バッファ内容を出力する.
二.c言語でよく使われる文字入出力関数(printf,sprintf,sscanf)
1. int printf(const char *format, ...);
関数の戻り値は整数です.成功すると出力された文字数が返され、出力エラーが発生すると負の値が返されます.
printf()関数の呼び出しフォーマットは、次のとおりです.
printf("", );
フォーマット文字列には2つの部分が含まれています.一部は正常な文字で、これらの文字はそのまま出力されます.もう1つの部分は、出力コンテンツのフォーマットを決定するために1つまたは複数の所定文字を「%」でフォーマットします.
通常、デバッグ情報を印刷したり、キー情報を出力したりするためにシリアルポートに再定義します.
以下にstm 32上のシリアルポートでprintfを使用する例を示す
int fputc(int ch,FILE *f)
{
    USART_SendData(USART1,(u8)ch);

    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)          
    {
    }
    return ch;
}

上のprintfを除いて、私は仕事の中で最もよく使うのが文字列を処理するsprintfとsscanfであることを発見しました.
2. int sprintf(char *buffer, const char *format, [argument]…) 
フォーマットされたデータを文字列に書き込む役割を果たします.
パラメータ:
(1)buffer:charタイプのポインタであり、書き込まれた文字列ポインタを指す.
(2)format:フォーマット文字列、すなわちプログラムで所望のフォーマット;
(3)argument:任意のタイプのデータであってもよいオプションパラメータ;
関数の戻り値:bufferが指す文字列の長さ.
次のようになります.
#include  
int main()  
{  
    char buffer[10];  
    char *a = “1234”;  
    char *b = “abcd”;  
    sprintf(buffer, ”%s%s”, a, b);  
    printf(”buffer=%s
”, buffer); return 0; } :buffer =1234abcd

3. int sscanf(const char *str, const char *format,......);
役割は、指定したフォーマットに一致するデータを1つの文字列から読み込むことです.文字列から整数、浮動小数点数、文字列を取り出すことができます.
str:格納データ
format:フォームコントロール文字列.
sscanfには多くのアプリケーションのシーンがあります.
//    
#include
#include
int main()
{
	int year, month, day, hour, minute, second;
	sscanf("2019-12-12 11:50:24","%d-%d-%d %d:%d:%d",&year, &month, &day, &hour, &minute, &second);
	printf("time=%d-%d-%d %d:%d:%d
", year, month, day, hour, minute, second); return 0; }
//         。     ,      4      。

   sscanf("123456","%4s",str);
  printf("str=%s",str);

  : 1234

sscanfはまた、単純な正規表現と一致してデータを抽出することもできる.
//             。     ,             。

sscanf("1111111abcdedfBCDEF","%[^A-Z]",str);
printf("str=%s",str);

  : str=1111111abcdedf




ここで、%[^A-Z]は、A-Zに読み込まれた文字が読み込まれると、読み込みが終了することを示す.ではscanf("%*[^A-Z])は、A-Z以外の文字を読み取ると読み込みが終了することを示す.
文字列の読み取りと書き込みについては、先にこんなにたくさん書いておき、後で慣れない追加に遭遇します.