電話帳------値分離命令とパラメータの改善

3590 ワード

コマンドの解析はcmd[3]=0,strcpy(file,cmd+4)で実現され,比較的奇妙である.コマンドヘッダが3バイトしかない秘密を知らなければならない将来コマンドフォーマットが変化すると、面倒になるのはwhileサイクルで変更するだけで、コマンド解析を理解する以外に、他の多くの意味を理解する必要があります.また、他のコマンド解析もstrcpyを行う必要があります.繰り返しは罪です.コマンド解析の機能抽出処理のもう一つの問題:「-ld c:test」を入力してから「-ld」を入力すると、「c:test」は依然として単一ステップデバッグが存在し、cmdのメモリ内の変化を観察してscanfの前にcmdをクリアする
// 2.17.cpp :              。
//

#include "stdafx.h"
#include <windows.h>
#include <string.h>

const unsigned int MAX_LENGTH_OF_CMD = 300;
const unsigned int MAX_LENGTH_OF_CMD_HEAD = 10;

const char* DEFAULT_FILE_NAME = "temp.txt";

/*
strDefaultFileFullPath          ,   MAX_PATH
*/
bool GetDefaultFileFullPath(char *strDefaultFileFullPath, const char *strDefaultFileName, const char *strArgv0)
{
	int i = strlen(strArgv0) - 1;
	while(i >= 0)
	{
		if(strArgv0[i] == '\\')
			break;

		i--;
	}

	if(i < 0)
	{
		strcpy(strDefaultFileFullPath, strDefaultFileName);
	}
	else
	{
		strcpy(strDefaultFileFullPath, strArgv0);
		strcpy(strDefaultFileFullPath + i + 1, strDefaultFileName);
	}

	return true;
}

void DisplayDefaultFile(const char *strDefaultFileFullPath)
{
	FILE *fp = fopen(strDefaultFileFullPath, "r+");
	if(fp != NULL)
	{
		while(1)
		{
			char buf[MAX_PATH];
			if(fgets(buf, MAX_PATH, fp) == NULL)
				break;

			printf("%s", buf);
		}

		fclose(fp);
	}
	else
	{
		printf("Default file does not exist.
"); } } /* strCommandHead strParameter , MAX_LENGTH_OF_CMD_HEAD、MAX_LENGTH_OF_CMD */ bool InterpretCommand(const char* strCommand, char *strCommandHead, char *strParameter) { if(strlen(strCommand) < 3) return false; char cmd[MAX_LENGTH_OF_CMD]; memset(cmd, 0, MAX_LENGTH_OF_CMD); strcpy(cmd, strCommand); cmd[3] = 0; strcpy(strCommandHead, cmd); if(strlen(strCommand) > 3) strcpy(strParameter, cmd + 4); return true; } void EnterCommandLoop() { char cmd[MAX_LENGTH_OF_CMD]; while(1) { printf("Please input your command : "); memset(cmd, 0, MAX_LENGTH_OF_CMD); if(scanf("%[^
]", cmd) == 0) { fflush(stdin); continue; } fflush(stdin); char cmd_head[MAX_LENGTH_OF_CMD_HEAD]; char cmd_parameter[MAX_LENGTH_OF_CMD]; memset(cmd_head, 0, MAX_LENGTH_OF_CMD_HEAD); memset(cmd_parameter, 0, MAX_LENGTH_OF_CMD); if(!InterpretCommand(cmd, cmd_head, cmd_parameter)) { printf("Command false.
"); continue; } printf("Your command is : %s
", cmd); if(strcmp(cmd_head, "-ld") == 0) { printf("Needed load file is %s
", cmd_parameter); continue; } if(strcmp(cmd_head, "-sa") == 0) { printf("will export phone book to %s
", cmd_parameter); continue; } if(strcmp(cmd_head, "-se") == 0) { printf("will save phone book
"); continue; } if(strcmp(cmd_head, "-ad") == 0) { printf("will add item(name phone): %s
", cmd_parameter); continue; } if(strcmp(cmd_head, "-qt") == 0) { printf("quit now ....
"); break; } printf("False Command
"); } } int _tmain(int argc, _TCHAR* argv[]) { char DefaultFileFullPath[MAX_PATH]; GetDefaultFileFullPath(DefaultFileFullPath, DEFAULT_FILE_NAME, argv[0]); printf("Default file path: %s
", DefaultFileFullPath); DisplayDefaultFile(DefaultFileFullPath); EnterCommandLoop(); return 0; }

我々の改善はif elseの中の1つの重複コードを除去して、0を置いた後に-ld問題の関数を解決してカプセル化した後に解決しました命令のフォーマットが変化するならば、ただ関数の中の数字の3を変えるだけでいいです