ft printf 2 1日目


正式にft printfの制作を開始します。


私が初めて考えたメカニズムは:初めて基礎的に考える部分なので、不足が多いです.

mainではft printf("..."a, b, c);に示すようにft printfでは、プライマリパラメータが正しいかどうかを確認します.
じゃ、いつ間違いを犯すか考えてみましょう.man printfでprintfの情報を表示する
int printf(const char *format, ...);
デフォルトでは、受信した最初のパラメータはstringです.こんな時に間違いはありませんか?
1. printf(a);このように非stringの通常変数を受信する場合.
2. printf();このようにパラメータを一切受け入れない場合.
2つの程度が存在する.
では、このようなエラーを受信した場合、printfはどの値を返すべきでしょうか.
printfの戻り値からint型を返す.printfは出力関数でvoid型の関数だと思っていましたが、チェックしてint型であることがわかりました.printfはテストを行い、何を返すかを確定したい.
#include <stdio.h>

int main()
{
	int a = 5;
	int size;

	size = printf("%d\n", a);
	printf("%d", size);
}
c6r6s6% ./a.out
5
2%
コンパイル後の実行時、最初のprintfはaの値5を出力し、printfは値size出力2を返す.どんな値段なのか、私は感じています.出力された数値5と「n」の合計数は(?)2を印刷しましたか?
別の値でテストしましょう.
#include <stdio.h>

int main()
{
	char *str = "abcd";
	int size;

	size = printf("%s\n", str);
	printf("%d", size);
}
./a.out
abcd
5%
string変数であることを確認すると、文字列abcdと「n」を含む文字列の長さが出力されます.
ではprintfが間違っている場合-1を返せばいいのでしょうか?
Return value
Upon successful return, these functions return the number of characters printed (excluding the null byte used to end output to strings).
The functions snprintf() and vsnprintf() do not write more than size bytes (including the terminating null byte ('\0')). If the output was truncated due to this limit then the return value is the number of characters (excluding the terminating null byte) which would have been written to the final string if enough space had been available. Thus, a return value of size or more means that the output was truncated. (See also below under NOTES.)
If an output error is encountered, a negative value is returned.
念のためmanprintfを見て、最後の文章でnegvalueに戻ることを親切に説明しました.

主な問題

/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   ft_printf.c                                        :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: hwalee <[email protected]>                      +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/11/09 14:55:11 by hwalee            #+#    #+#             */
/*   Updated: 2020/11/09 17:51:35 by hwalee           ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "ft_printf.h"

int	ft_check_for(const char *format)
{

}

int	ft_printf(const char *format, ...)
{
	va_list ap;

	va_start(ap, format);
	if (ft_check_for(format) == ERROR)
		return (ERROR);
    size = ft_strlen(format);
	return (size);
}
ふと思いついたことをコードしてみたら、問題が見つかりました.正直、他の人が書いたコードを見てみましたが、なぜ構造体を書くのか分かりません.だから私はただ普通の変数を作成したいだけです(多く発生しますが)、必要なときに呼び出して、最初から問題を発見しました.戻り値をエクスポートしながらstrlenに書き込み、この関数を返します(size).
フォーマットが「%d」の場合、strlenは2を返します.
同じ問題を発見した.しかし、別の関数が戻る必要がある場合、この関数は値を返さないため、問題が発生します.
最終的に構造体を使用しました
typedef struct  s_list{
    int size;
}               t_list;
まずコードを作成し、リストに変数を1つずつ追加します.

int ft_check_for


最初のサブ関数を作成しましょう.
最初の関数は、パラメータ値として受信されたformat文字列をチェックする関数です.
int ft_check_for(va_list ap, const char *format, t_list *list)

戻り値


ft check for()の戻り値はintに設定します.この理由は,本関数でエラー時,すなわち負の値の場合を条件としているためである.したがって、この関数では、上述したようにエラーが発生するとERRORが返され、正常に動作すると別の数が返される.
ERRORはft printfです.から
#define ERROR -1
として定義されます.

パラメータ


va_list ap


可変パラメータapはft printf(const char*format,...)を含むから値段が少しあります.ft printfを実行する場合は、これらの値を引き続き携帯する必要があるため、これを含めます.
初めて可変因子を関数のパラメータとした場合,どのように資料型を入れるか分からず,検索結果はvaリストを同様に入れればよいことを示した.

const char *format


基本的に持つ変数です.このformat文字列を使用してすべての内容を判断するためです."%"含むかどうか、printfオプションがあるかどうか、すべて含まれているため

t_list *list


構造変数tリストを
1.ft printf関数が最後に戻る場合は、本関数ではなく、サブ関数でsizeを求めるsizeを送信する必要があります.
2.flag、widthを他の関数で処理する必要がある場合、この構造体を使用する予感がする.