1. 程式人生 > >C++判斷使用者輸入路徑是否正確(判斷碟符是否存在以及“\”與"/")

C++判斷使用者輸入路徑是否正確(判斷碟符是否存在以及“\”與"/")

直接上程式碼,用了windows.h裡的函式獲取碟符

#include <iostream>
#include <Windows.h>
#include <string.h>
#include <string>
#include <tchar.h>
using namespace std;
string userPath;                     //使用者輸入路徑
string TcharToChar(TCHAR * tchar);   //TCHAR轉char函式,並存放在string中
string getDriveStrings();            //獲取系統碟符字串,返回string,形式為C:\\E:\\F:\\...
bool checkDrive(string drives, string userPath);   //檢查使用者輸入路徑碟符是否存在或合法,返回true或false
bool checkUserPath(string userPath);       //檢查使用者輸入路徑"\\"時候正確,不正確則給出提示,返回true或false
int main()
{
	bool isDriveExist;
	bool isUserPathRight;
	string drives = getDriveStrings();
	for (;;){
		userPath = "";
		cout << "請輸入檔案路徑:" << endl;
		cin >> userPath;
		isDriveExist = checkDrive(drives, userPath);
		if (!isDriveExist){
			continue;
		}
		else{
			isUserPathRight = checkUserPath(userPath);
			if (!isUserPathRight){
				continue;
			}
			else{
				cout << "路徑合法!" << endl;
				break;
			}
		}
	}
}

string getDriveStrings()
{
	TCHAR szBuf[100];
	memset(szBuf, 0, 100);
	DWORD len = GetLogicalDriveStrings(sizeof(szBuf) / sizeof(TCHAR), szBuf);
	string s = TcharToChar(szBuf);
	return s;
}

string TcharToChar(TCHAR * tchar)
{
	string sz;
	for (TCHAR * s = tchar; *s; s += _tcslen(s) + 1)
	{
		char * _char = new char[100];
		int iLength;
		//獲取位元組長度    
		iLength = WideCharToMultiByte(CP_ACP, 0, s, -1, NULL, 0, NULL, NULL);
		//將tchar值賦給_char      
		WideCharToMultiByte(CP_ACP, 0, s, -1, _char, iLength, NULL, NULL);
		string t(_char);
		sz.append(t);
		free(_char);
	}
	return sz;
}

bool checkDrive(string drives, string userPath)
{
	int position;
	char driveTag = userPath.at(0);
	if (driveTag > 'a' && driveTag < 'z'){
		driveTag -= 32;
	}
	if ((driveTag > 'A' && driveTag<'Z') || (driveTag>'a' && driveTag < 'z'))
	{
		position = drives.find(driveTag);
		if (position == drives.npos)
		{
			cout << "輸入的碟符不存在,請重新輸入!" << endl;
			return false;
		}
		else{
			return true;
		}
	}
	else
	{
		cout << "輸入碟符非法,請重新輸入!" << endl;
		return false;
	}
}

bool checkUserPath(string userPath)
{
	bool isRight = true;
	string::iterator it;
	for (it = userPath.begin(); it != userPath.end(); ++it)
	{
		if (*it == '/')
		{
			isRight = false;
			cout << "\'/\'錯誤,應該為\'\\',請重新輸入!" << endl;
			break;
		}
	}
	return isRight;
}


相關推薦

C++判斷使用者輸入路徑是否正確判斷是否存在以及“\”"/"

直接上程式碼,用了windows.h裡的函式獲取碟符 #include <iostream> #include <Windows.h> #include <string.h> #include <string> #includ

C# Word轉為多種格式文件Word轉XPS/SVG/EMF/EPUB/TIFF

C# Word轉XPS/SVG/EMF/EP .NET Word API 免費類庫 控件 一款有著強大的文檔轉換功能的工具,無論何時何地都會是現代辦公環境極為需要的。在本篇文章中,將介紹關於Word文檔的轉換功能(Word轉XPS/SVG/EMF/EPUB/TIFF)。希望方法中的代碼能為

C#泛型效能進階之排序遍歷後輸出元素值

而foreach語句是通過迭代變數來列舉集合的元素,為集合的每個元素執行嵌入語句。也就是說,foreach語句是通過迭代變數在集合內對其自身的引用來實現遍歷的,ArrayList類列表同樣是通過物件值引用來實現的。 而這也是稱之為強型別的原因,因為在編譯時沒有辦法告訴我們列表中資料的實際型別

Sql Server中儲存過程中輸入和輸出引數簡單例項,一看就懂

-- ===================【建立儲存過程】===================== USE [Message] GO /****** Object: StoredProcedure [dbo].[讀取外部資料庫查詢] Script Date:

C#幾種擷取字串的方法split 、Substring、Replace、remove

C#截圖字串常用的方法有 split 、Substring、Replace、remove等。 split的使用:  1. Split( Char ())      返回的字串陣列包含此例項中的子字串(

C++之訪問控制public、private、protected以及friend

public  所有均可訪問private 類自己的成員函式訪問,不能被類物件訪問protected 類自己以及子類訪問,不能被類物件訪問friend 友元,別人是你的朋友,他可以訪問我的東西。(但不是我可以訪問他的東西)友元關係不能被繼承。友元關係是單向的,不具有交換性。若

js判斷時間是否為今天日期判斷日期當前日期相差多少天

下面是我的程式碼: // 判斷時間為今天 judgeTime(data){ var date = data.toString(); var year = date.substring(

IOS TextField 輸入銀行卡號格式化每四位中間空一格

最近做的專案有關於銀行卡號輸入的情景設定,參照微信綁卡操作,輸入卡號數字每隔4位空1位。 由於趕進度,沒細作研究,特此網上摘錄的程式碼片段,如下: -(BOOL)textField:(UITextField *)textField shouldChangeCharact

c/c++程式設計題 之 猴子選大王陣列、連結串列兩種方法

一群猴子要選新猴王。新猴王的選擇方法是:讓N只候選猴子圍成一圈,從某位置起順序編號為1-N號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下一隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的一隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?

[C++]LeetCode 11: Container With Most Water最大容積/最大矩形面積

Problem: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn

C語言:幾個不常用或者說可能出錯的如const的type qualifier

幾個不常用(除const和volatile外)的type qualifiers,const和volatile應該算是最熟悉的了,但是其他的幾個就不大容易在程式碼中發現,寫下來順便學習下描述:這幾個type qualifiers的使用範圍是有限制的,const和volatile

初學C語言:輸入10個整數,將其中最小的數第一個數對換,把最大的數最後一個數對換。

#include<stdio.h> void input(int a[10]) { int i; for (i=0;i<10;i++) { scanf("%d",&

C/C++】c/c++基礎加進階視頻教程含數據結構和設計模式

process 1.5 正在 子集 多態 c++編程 基本 開發 數據 收集整理了c和c++從基礎到進階的視頻教程,共26.4G,歡迎下載。至於學習c++要不要先學c的問題也是見仁見智,個人覺得在c語言的基礎上學c++會更有效率一些。這套視頻教程包含了c語言課程,麻油們可以

as 插件GsonFormat用法json字串快速生成javabean

idt for form wid mage 插件 json blank http GsonFormat 主要用於使用Gson庫將JSONObject格式的String 解析成實體,該插件可以加快開發進度,使用非常方便,效率高。 插件地址:https://plugins.je

Python的Django框架完成一個完整的論壇1.settings.py源碼以及解釋

zone sage path bsp ges request nat templates types 完成後效果:http://www.cnblogs.com/xuyiqing/p/8274912.html settings.py源碼 """ Django settin

Redis系列--內淘汰機制含單機版內優化建議

del dbn amp 一段 最簡 nal imp 同學 博客 https://blog.csdn.net/Jack__Frost/article/details/72478400?locationNum=13&fps=1 每臺redis的服務器的內存都是有限的,而

shell指令碼抽取文字檔案中指定字串的方法:sed+grep方法、awk+grep方法必要時可以聯合sed以及grep、grep+cut方法

在linux中經常要對一些動態的文字檔案抽取指定的字串,比如執行ps命令後想要獲取指定的執行程序(如ps自己)的PID號(同一個程序每次啟動的時候pid號是隨機分配的)。該怎麼辦呢?當然,可以用一些擷取字串的方法,這裡介紹一下用2種方法來解決這類問題。 一、sed+grep方法: 首先大概瞭

面試前的準備java專業 ~學習演算法排序以及查詢

java專業的馬上大三,東西學的差不多,但是資料結構這塊特別薄弱,所以面試前對自己資料結構進行鞏固複習(PS:其實是預習啦~) 針對自己薄弱的幾塊進行記錄:(排序和查詢) 每天都在叫囂自己會什麼技術,什麼框架,可否意識到你每天都在被這些新名詞、新技術所迷惑,.NET、

tensorflow學習2.網路模型的儲存以及提取

第一篇學習了CNN網路的構建以及程式碼的基礎結構,第二篇則是實際專案過程中需要的網路模型的儲存 先放上儲存的程式碼: #tf可以認為是全域性變數,從該變數為類,從中取input_data變數 import tensorflow.examples.tutorials.mni

Unity實戰篇:移植遊戲到安卓平臺的注意事項及其例項物件池概念的引入以及優化

1.物件池基礎概念的瞭解(必看) 2.針對專案來進行嵌入 using System.Collections; using System.Collections.Generic; using UnityEngine; using Unit