C言語の可変パラメータと文字の入出力
3203 ワード
一.可変パラメータの処理
プログラムを書くとき、入力されたパラメータが確定している場合は、順番に処理すればいいです.パラメータの長さが不確定な場合、どのように処理しますか?
Cでは、伝達関数のすべての実パラメータのタイプと数をリストできない場合、パラメータテーブルを省略記号で指定できます.例えばvoid func(...)
また、C言語は標準的な処理方法を提供しています.
まず次の例を見てみましょう.(この関数は、不定長の文字を出力することを実現します)
各セグメントのコードの意味を一歩一歩分析します.
(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を使用する例を示す
上のprintfを除いて、私は仕事の中で最もよく使うのが文字列を処理するsprintfとsscanfであることを発見しました.
2. int sprintf(char *buffer, const char *format, [argument]…)
フォーマットされたデータを文字列に書き込む役割を果たします.
パラメータ:
(1)buffer:charタイプのポインタであり、書き込まれた文字列ポインタを指す.
(2)format:フォーマット文字列、すなわちプログラムで所望のフォーマット;
(3)argument:任意のタイプのデータであってもよいオプションパラメータ;
関数の戻り値:bufferが指す文字列の長さ.
次のようになります.
3. int sscanf(const char *str, const char *format,......);
役割は、指定したフォーマットに一致するデータを1つの文字列から読み込むことです.文字列から整数、浮動小数点数、文字列を取り出すことができます.
str:格納データ
format:フォームコントロール文字列.
sscanfには多くのアプリケーションのシーンがあります.
sscanfはまた、単純な正規表現と一致してデータを抽出することもできる.
ここで、%[^A-Z]は、A-Zに読み込まれた文字が読み込まれると、読み込みが終了することを示す.ではscanf("%*[^A-Z])は、A-Z以外の文字を読み取ると読み込みが終了することを示す.
文字列の読み取りと書き込みについては、先にこんなにたくさん書いておき、後で慣れない追加に遭遇します.
プログラムを書くとき、入力されたパラメータが確定している場合は、順番に処理すればいいです.パラメータの長さが不確定な場合、どのように処理しますか?
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以外の文字を読み取ると読み込みが終了することを示す.
文字列の読み取りと書き込みについては、先にこんなにたくさん書いておき、後で慣れない追加に遭遇します.