C# 控制台輸入和輸出

来源:https://www.cnblogs.com/vin-c/archive/2019/12/08/12007933.html
-Advertisement-
Play Games

[toc] 控制台視窗是一種簡單的命令提示視窗,允許程式顯示文本並從鍵盤接受輸人。 使用 方法獲取輸入,使用 方法輸出。 從控制台獲取輸入 可用 方法獲取控制台輸入的文本。程式執行到這一行代碼時,它將暫停程式執行並等待用戶輸入。用戶輸入內容後(也可以不輸入)按回車鍵,程式將繼續執行。 方法的輸出,也 ...


目錄

控制台視窗是一種簡單的命令提示視窗,允許程式顯示文本並從鍵盤接受輸人。

使用 Console.ReadLine() 方法獲取輸入,使用 Console.WriteLine() 方法輸出。

從控制台獲取輸入

可用 System.Console.ReadLine() 方法獲取控制台輸入的文本。程式執行到這一行代碼時,它將暫停程式執行並等待用戶輸入。用戶輸入內容後(也可以不輸入)按回車鍵,程式將繼續執行。System.Console.ReadLine() 方法的輸出,也稱為返回值,就是用戶輸入的文本字元串。

static void Main(string[] args)
{
    // 定義變數
    string firstStr, secondStr;

    // 輸出內容到控制台
    Console.WriteLine("請輸入第一個字元串:");

    // 接收用戶輸入,為變數賦值
    firstStr = Console.ReadLine();

    // 輸出內容到控制台
    Console.WriteLine("請輸入第二個字元串:");

    // 接收用戶輸入,為變數賦值
    secondStr = Console.ReadLine();

    // 輸出內容到控制台
    Console.WriteLine("你輸入的第一個字元串是:{0};第二個字元串是:{1}",firstStr,secondStr);
}

展示一段“價值上億”的 AI 核心代碼

using System;

namespace ConsoleApp
{
    class Program
    {

        static void Main()
        {
            while (true)
            {
                string str = Console.ReadLine();

                if (string.IsNullOrWhiteSpace(str))
                {
                    continue;
                }

                str = str.Replace("嗎", "");
                str = str.Replace("?", "!");
                str = str.Replace("?", "!");

                Console.WriteLine(str);
            }
        }
    }
}

效果

可以智能應答,很厲害是不是?

其實就是幾個字元替換!抖了個機靈,也順便黑了把當下某些言必稱 AI 的風氣。你別說,當年區塊鏈概念火爆的時候,還真有人代碼里放了個“Hello World”就出來誆錢了。風口之下,什麼樣的妖魔鬼怪都有。

將輸出寫入控制台

Console.Write()

Console.Write() 方法把一個文本字元串發送到程式的控制台視窗。最簡單的情況下,Console.Write() 將文本的字元串字面量發送到視窗,字元串必須使用雙引號括起來。如下麵的代碼:

Console.Write("這是一個文本字元串字面量");

輸出

這是一個文本字元串字面量

另外一個示例是下麵的代碼,發送了 3 個文本字元串到程式的控制台視窗:

Console.Write("第一個字元串");
Console.Write("第二個字元串");
Console.Write("第三個字元串");

輸出

第一個字元串第二個字元串第三個字元串

Console.Write() 方法沒有在字元串後面添加換行符,所以三條語句都輸出到同一行。

Console.WriteLine()

Console.WriteLine() 方法和 Console.Write() 實現相同的功能,但會在每個輸出字元串的結尾添加一個換行符。如下麵的代碼:

Console.Write("第一個字元串");
Console.Write("第二個字元串");
Console.Write("第三個字元串");

輸出

第一個字元串
第二個字元串
第三個字元串

格式字元串

Console.Write()Console.WriteLine()的常規形式中可以有一個以上的參數。如果不只一個參數,參數間用逗號分隔,第一個參數必須總是字元串,稱為格式字元串。格式字元串可以包含替代標記。

  • 替代標記在格式字元串中標出位置,在輸出串中該位置將用一個值來替代。
  • 替代標記由一個整數及括住它的一對大括弧組成,其中整數就是替換值的數字位置。

跟著格式字元串的參數稱為替換值,這些替換值從 0 開始編號。語法如下:

Console.WriteLine(格式字元串(含替代標記),替換值0,替換值1,替換值2,...);

例如,下麵的語句有兩個替代標記,編號 0 和 1;以及兩個替換值,它們的值分別是 3 和 6。

Console.WriteLine("兩個整數示例是 {0} 和 {1}",3,6);

輸出

兩個整數示例是 3 和 6

其中 "兩個整數示例是 {0} 和 {1}" 是格式字元串,{0}{1} 是替代標記,36 是替換值。

多重標記和值

可以使用任意數量的替代標記和任意數量的值。

  • 值可以以任何順序使用。
  • 值可以在格式字元串中替換任意次。

例如,下麵的語句使用了 3 個標記但只有兩個值。

Console.WriteLine("三個整數是 {1}、{0} 和 {1}", 3, 6);

輸出

三個整數是 6、3 和 6

標記不能引用超出替換值列表長度以外位置的值。如果引用了,雖然不會產生編譯錯誤,但會產生運行時錯誤(稱為異常)。

例如,在下麵的語句中有兩個替換值,在位置 0 和 1。而第二個標記引用了位置 2,位置 2 並不存在。這將會產生一個運行時錯誤。

Console.WriteLine("兩個整數示例是 {0} 和 {2}",3,6);

輸出錯誤信息

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
  at System.Text.StringBuilder.AppendFormatHelper (System.IFormatProvider provider, System.String format, System.ParamsArray args) <0x25629e8 + 0x00208> in <67a88994620f4374b07defa73dd07570>:0 
  at System.String.FormatHelper (System.IFormatProvider provider, System.String format, System.ParamsArray args) <0x255aec8 + 0x00050> in <67a88994620f4374b07defa73dd07570>:0 
  at System.String.Format (System.IFormatProvider provider, System.String format, System.Object arg0, System.Object arg1) <0x2dd0038 + 0x00020> in <67a88994620f4374b07defa73dd07570>:0 
  at System.IO.TextWriter.WriteLine (System.String format, System.Object arg0, System.Object arg1) <0x2dcffd8 + 0x0001e> in <67a88994620f4374b07defa73dd07570>:0 
  at System.IO.TextWriter+SyncTextWriter.WriteLine (System.String format, System.Object arg0, System.Object arg1) <0x2dcff18 + 0x00018> in <67a88994620f4374b07defa73dd07570>:0 
  at (wrapper synchronized) System.IO.TextWriter+SyncTextWriter.WriteLine(string,object,object)
  at System.Console.WriteLine (System.String format, System.Object arg0, System.Object arg1) <0x2dcfb98 + 0x00016> in <67a88994620f4374b07defa73dd07570>:0 
  at Program.Main () <0x2de2270 + 0x00014> in <eb71b37b85e34ec398032577572312ee>:0 
  at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) <0x23eabf8 + 0x000d2> in <67a88994620f4374b07defa73dd07570>:0 
   --- End of inner exception stack trace ---
  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) <0x23eabf8 + 0x000fe> in <67a88994620f4374b07defa73dd07570>:0 
  at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) <0x23ea670 + 0x00016> in <67a88994620f4374b07defa73dd07570>:0 
  at System.CommandLine.Invocation.ModelBindingCommandHandler.InvokeAsync (System.CommandLine.Invocation.InvocationContext context) <0x2dcacf8 + 0x000b6> in <6793e93bcbca41a69b5ad876f7ba42b9>:0 
  at System.CommandLine.Invocation.InvocationPipeline+<>c__DisplayClass2_0.<InvokeAsync>b__0 (System.CommandLine.Invocation.InvocationContext invocationContext, System.Func`2[T,TResult] next) <0x2dc4538 + 0x0018e> in <6793e93bcbca41a69b5ad876f7ba42b9>:0 
  at System.CommandLine.Invocation.InvocationPipeline.InvokeAsync (System.CommandLine.IConsole console) <0x2db5980 + 0x00216> in <6793e93bcbca41a69b5ad876f7ba42b9>:0 
  at System.CommandLine.Invocation.InvocationExtensions.InvokeAsync (System.CommandLine.Parser parser, System.CommandLine.ParseResult parseResult, System.CommandLine.IConsole console) <0x2db4790 + 0x000fc> in <6793e93bcbca41a69b5ad876f7ba42b9>:0 
  at System.CommandLine.Invocation.InvocationExtensions.InvokeAsync (System.CommandLine.Parser parser, System.String[] args, System.CommandLine.IConsole console) <0x2d4ef48 + 0x00110> in <6793e93bcbca41a69b5ad876f7ba42b9>:0 
  at MLS.WasmCodeRunner.CodeRunner.ExecuteRunRequest (MLS.WasmCodeRunner.WasmCodeRunnerRequest runRequest, System.Int32 sequence) <0x2cc69f0 + 0x0011c> in <d9fa2833845c4c548df55c8997a5a46d>:0 

格式化字元串

在很多時候,我們希望以更合適的格式而不是一個簡單的數字來呈現文本字元串的輸出。例如,把值作為貨幣或者某個小數位數的定點值來顯示。這些都可以通過格式化字元串來實現。

例如,下麵的代碼由兩條列印值 500 的語句組成。第一行沒有使用任何其他格式化來列印數字,而第二行的格式化字元串指定了數字應該被格式化成貨幣。

// 輸出數字
Console.WriteLine("數字:{0}", 500);

//格式為貨幣
Console.WriteLine("格式化成貨幣的表現形式:{0:C}", 500);

輸出

數字:500
格式化成貨幣的表現形式:¥500.00

兩條語句的不同之處在於,格式項以格式說明符形式包括了額外的信息。大括弧內的格式說明符的語法由 3 個欄位組成:索引號、對齊說明符和格式欄位(format field)。語法如下:

{index[,alignment][:formatString]}
  • index:必需,指定值列表中的某一項
  • alignment:可選,指定欄位寬度,以及是否是右對齊或左對齊
  • formatString:可選,指定項的格式

註意: 對齊使用逗號,格式使用冒號

索引

格式說明符的第一項是索引號。索引指定了之後的格式化字元串應該格式化值列表中的哪一項。

Console.WriteLine("小於 10 的質數:{0},{1},{2},{3}", 2, 3, 5, 7);

輸出

小於 10 的質數:2,3,5,7

對齊說明符

對齊說明符表示了欄位中字元的最小寬度。對齊說明符有如下特性。

  • 對齊說明符是可選的,並且使用逗號來和索引號分離。
  • 它由一個正整數或負整數組成。
    • 整數表示了欄位使用字元的最少數量。
    • 符號表示了右對齊或左對齊。正數表示右對齊,負數表示左對齊。

例如,如下格式化 int 型變數 myInt 的值的代碼顯示了兩個格式項。在第一個示例中,myInt 的值以在 10 個字元寬度的字元串中右對齊的形式進行顯示;第二個示例中則是左對齊。格式項放在兩個豎杠中間,這樣在輸出中就能看到它們的左右邊界。

int myInt = 500;

//右對齊
Console.WriteLine("|{0, 10}|", myInt);

//左對齊
Console.WriteLine("|{0,-10}|", myInt);

輸出

|       500|
|500       |

值的實際表示可能會比對齊說明符指定的字元數多-些或少一 些:

  • 如果要表示的字元數比對齊說明符中指定的字元數少,那麼其餘字元會使用空格填充
  • 如果要表示的字元數多於指定的字元數,對齊說明符會被忽略,並且使用所需的字元進行表示
int myInt = 500;
int myInt2 = 5000000;

//右對齊
Console.WriteLine("|{0, 5}|", myInt);

//左對齊
Console.WriteLine("|{0,-5}|", myInt2);

輸出

|  500|
|5000000|

格式欄位

格式欄位指定了數字應該以哪種形式表示。例如,應該被當做貨幣、十進位數字、十六進位數字還是定點符號來表示。

格式欄位有三部分。

  • 冒號後必須緊跟著格式說明符,中間不能有空格。
  • 格式說明符是一個字母字元,是 9 個內置字元格式之一。 字元可以是大寫或小寫形式。大小寫對於某些說明符來說比較重要,而對於另外一些說明符來說則不重要。
  • 精度說明符是可選的,由 1 ~ 2 位數字組成。它的實際意義取決於格式說明符。

如下代碼是格式字元串組件語法的一個示例:

Console.WriteLine("{0:F4}", 12.345678);

輸出

12.3457

其中,F 表示使用浮點數來表示。4 表示 4 位精度(保留小數點後 4 位)

如下代碼給出了不同格式字元串的一些示例:

double myDouble = 12.345678;

Console.WriteLine("|{0,-10:G}| -- 常規,左對齊", myDouble);

Console.WriteLine("|{0,-10}| -- 常規,左對齊", myDouble);
                    
Console.WriteLine("|{0,10:F4}| -- 保留小數點後 4 位,右對齊", myDouble);
                    
Console.WriteLine("|{0,-10:C}| -- 貨幣", myDouble);
                    
Console.WriteLine("|{0,-10:E3}| -- 科學計數法", myDouble);
                    
Console.WriteLine("|{0,-10:x}| -- 十六進位", 1194719);

輸出

|12.345678 | -- 常規,左對齊
|12.345678 | -- 常規,左對齊
|   12.3457| -- 保留小數點後 4 位,右對齊
|¥12.35    | -- 貨幣
|1.235E+001| -- 科學計數法
|123adf    | -- 十六進位

標準數字格式說明符

下表總結了 9 種標準數字格式說明符,如果說明符字元根據它們的大小寫會有不同的輸出,就會標註為區分大小寫。

格式說明符 說明 示例 結果
C 或 c 貨幣
使用貨幣符號把值格式化為貨幣,貨幣符號取決於程式所在 PC 的區域設置
精度說明符:小數位數
Console.WriteLine("{0:C}", 12.5);
Console.WriteLine("{0:C5}", 12.5);
¥12.50
¥12.50000
D 或 d 十進位數字字元串,需要的情況下可以有負數符號。只能和整數類型配合使用
精度說明符:輸出字元串中的最少位數。如果實際數字的位數更少,則在左邊以 0 填充
Console.WriteLine("{0:D5}", 25);
00025
E 或 e 科學計數法,區分大小寫
具有尾數和指數的科學記數法。指數前面加字母 E。E 的大小寫和說明符一致
精度說明符:小數的位數
Console.WriteLine("{0:E2}", 250000); 2.50E+005
F 或 f 定點 Console.WriteLine("{0:F4}", 12.345678); 12.3457
G 或 g 常規
在沒有指定說明符的情況下,會根據值轉換為定點或科學記數法表示的緊湊形式
精度說明符:根據值
Console.WriteLine("{0:G5}", 12.1234567890123456789);
Console.WriteLine("{0:G5}", 123456789.1234567890123456789);
12.123
1.2346E+08
N 或 n 數字
和定點表示法相似,但是在每三個數字的一組中間有逗號或空格分隔符。從小數點開始往左數。
使用逗號還是空格分隔符取決於程式所在 PC 的區域設置
精度說明符:小數的位數
Console.WriteLine("{0:N6}", 123456789.123456789);
123,456,789.123457
P 或 p 百分比
表示百分比的字元串。數字會乘以 100
精度說明符:小數的位數
Console.WriteLine("{0:P2}", 0.123456789); 12.35%
R 或 r 往返過程
保證輸出字元串後如果使用 Parse 方法將字元串轉化成數字,那麼該值和原始值一樣。
精度說明符:忽略
Console.WriteLine("{0:R}", 123.123456789); 123.123456789
X 或 x 十六進位,區分大小寫
十六進位數字 A ~ F 會匹配說明符的大小寫形式
精度說明符:輸出字元串中的最少位數。如果實際數的位數更少,則在左邊以 0 填充
Console.WriteLine("{0:X}", 250);
Console.WriteLine("{0:X4}", 250);
FA
00FA

$ 字元串插值

從 C# 6.0 開始引入的字元串插值功能。下麵的代碼在 Console.WriteLine() 調用中為字元串字面量附加的 $ 首碼,它表明使用了字元串插值。

static void Main(string[] args)
{
    // 定義變數
    string firstStr, secondStr;

    // 輸出內容到控制台
    Console.WriteLine("請輸入第一個字元串:");

    // 接收用戶輸入,為變數賦值
    firstStr = Console.ReadLine();

    // 輸出內容到控制台
    Console.WriteLine("請輸入第二個字元串:");

    // 接收用戶輸入,為變數賦值
    secondStr = Console.ReadLine();

    // 輸出內容到控制台
    Console.WriteLine($"你輸入的第一個字元串是:{firstStr};第二個字元串是:{secondStr}");
}

若要將字元串標識為內插字元串,可在該字元串前面加上 $ 符號。 字元串文本開頭的 $" 之間不能有任何空格。

左大括弧和右大括弧({})指示內插表達式。可將任何返回值的 C# 表達式置於大括弧內(包括 null)。

與使用字元串複合格式設置功能創建格式化字元串相比,字元串內插提供的語法更具可讀性,且更加方便。 下麵的示例使用了這兩種功能生成同樣的輸出結果:

static void Main(string[] args)
{
    string name = "Mark";
    var date = DateTime.Now;

    // 複合格式化
    Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);

    // 字元串插值
    Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
}

輸出

Hello, Mark! Today is Sunday, it's 12:34 now.
Hello, Mark! Today is Sunday, it's 12:34 now.

當表達式結果的類型不是字元串時,會按照以下方式將其解析為字元串:

  • 如果內插表達式的計算結果為 null,則會使用一個空字元串(""String.Empty)。
  • 如果內插表達式的計算結果不是 null,通常會調用結果表達式的 ToString 方法。

總結

本篇文章介紹了用於從控制台獲取輸入的 Console.ReadLine() 方法,以及將輸出寫入控制台的 Console.Write() 方法和 Console.WriteLine() 方法。它們的區別是 Console.WriteLine() 會在每個輸出字元串的結尾添加一個換行符。

另外,還介紹了字元串複合格式化的設置和用法,用於將數字輸出到不同的格式。從 C# 6 開始可以使用字元串插值功能,與使用字元串複合格式設置功能創建格式化字元串相比,字元串內插提供的語法更具可讀性,且更加方便。

原文鏈接:https://www.vinanysoft.com/c-sharp-basics/introducing/console-input-and-output/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這個問題,是python與Pycharm不相容導致,解決辦法將Pycharm升級最新版本 ...
  • Shiro是一個功能強大且易於使用的Java安全框架,主要功能有身份驗證、授權、加密和會話管理,本文實現一個簡單的身份驗證例子。 ...
  • 人生從來沒有固定的路線,決定你能夠走多遠的,並不是年齡,而是你的努力程度。無論到了什麼時候,只要你還有心情對著糟糕的生活揮拳宣戰,都不算太晚。遲做,總比不做好! ...
  • # 集美大學各省錄取分數分析(學號尾數為2,3同學完成) # 分析文件‘集美大學各省錄取分數.xlsx’,完成: # 1)集美大學2015-2018年間不同省份在本一批的平均分數,柱狀圖展示排名前10的省份, # 2)分析福建省這3年各批次成績情況,使用折線圖展示結果,並預測2019年錄取成績(數據... ...
  • 本文中 $n$ 代表著待排序序列的長度。 演算法是否穩定:若 $a_i = a_j \ , \ i 1; merge(l,mid),merge(mid+1,r); mergesort(l,r,mid);return;//遞歸,先給小區間排序後大區間。 } merge(1,n); 上張圖理解一下: 可用 ...
  • 前一陣子在寫 CPU,導致一直沒有什麼時間去做其他的事情,現在好不容易做完閑下來了,我又可以水文章了哈哈哈哈哈。 有關 FP 的類型部分我打算放到明年再講,因為現有的 C# 雖然有一個 pattern matching expressions,但是沒有 discriminated unions 和  ...
  • 前言 雖然說學習新的開發框架是一項巨大的投資,但是作為一個開發人員,不斷學習新的技術並快速上手是我們應該掌握的技能,甚至是一個.NET Framework開發人員,學習.NET Core 新框架可以更快速掌握其中的編寫,構建,測試,部署和維護應用程式。 您現有的.NET Framework應用程式可 ...
  • 我們可以使有dotnetcore跨平臺的特性,優雅的實現在dotnetcore執行shell (bash). 代碼如下:using System;using System.Collections.Generic;using System.Text;namespace hshoc{ using Sys... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...