主頁 > .NET開發 > 初始化字串陣列的最佳方法是將其傳遞給一個函式

初始化字串陣列的最佳方法是將其傳遞給一個函式

2021-10-19 01:31:12 .NET開發

我需要初始化一個固定大小的空字串陣列(例如,3乘100),將其傳遞給一個函式以填充資料,并對其執行strcpy()、strcmp()、memset()等操作。在該函式結束后,我需要能夠從我的main()中讀取資料。

到目前為止我所嘗試的是:

char arrayofstrings[3][100] = {0};
char (*pointer)[3][100] = & arrayofstrings;

function(pointer)。

初始化一個(空的)字串陣列,并在第一個元素上初始化一個指標。

int function (char (*pointer)[3][100]) 
{
strcpy((*pointer)[i], somepointertostring)。
strcmp((*pointer)[i], somepointertostring)
memset((*pointer)[i], 0, strlen((*pointer)[i])。

這是個好方法嗎?有什么更簡單的方法嗎?指標周圍的方括號是怎么回事?

uj5u.com熱心網友回復:

你不需要額外的指示級別。

一個陣列,當傳遞給一個函式時,會被轉換為一個指向其第一個成員的指標。 因此,如果你像這樣宣告函式:

一個陣列被傳遞給一個函式時,會被轉換為其第一個成員的指標。

int function(char (*pointer) [100])

或者等價地:

int function(char pointer[][100]) 

或者:

int function(char pointer[3][100]) 

你可以直接將陣列傳遞給函式:

function(arrayofstrings);

那么主體可以是這樣的:

strcpy(pointer[0], "some string") 。
strcpy(pointer[1], "some other string") 。
strcpy(pointer[2], " yet another string")。

uj5u.com熱心網友回復:

初始化字串陣列的最佳方法...

char arrayofstrings[3][100] = {0};對于初始化一個字串陣列來說是不錯的。

在C語言中,初始化只在物件定義時進行,如上圖。

后面的代碼,如strcpy()分配資料到陣列。


最好的方法是......把它傳遞給一個函式

  • 當C編譯器支持可變長度陣列時,使用function(size_t n, size_t sz, char a[n][sz])

  • 添加錯誤檢查。

  • 使用size_t來確定陣列的大小和索引。


#define somepointertostring "Hello World" int function(size_tn, size_t sz, char arrayofstrings[n][sz]) { if (sz <= strlen(somepointertostring)) { return 1; } for (size_t i = 0; i < n; i ) { strcpy(arrayofstrings[i], somepointertostring)。 if (strcmp(arrayofstrings[i], somepointertostring) { return 1; } //Drop this it see something interesting in `foo()`. memset(arrayofstrings[i], 0, strlen(arrayofstrings[i]))。 } return 0; } void foovoid { char arrayofstrings[3][100] = {0}; size_t n = sizeof arrayofstrings / sizeof arrayofstrings[0] 。 size_t sz = sizeof arrayofstrings[0] 。 if (function(n, sz, arrayofstrings)) { puts("Fail"/span>)。 } else { puts("Success") 。 puts(arrayofstrings[0])。 } }

uj5u.com熱心網友回復:

對一個(空的?)字串陣列進行初始化,并在第一個元素上初始化一個指標。

&arrayofstrings的型別是char (*)[3][100],即指向一個物件的指標,這個物件是一個2D型別的char陣列,維度為3 x 100。所以,這個初始化

char (*pointer)[3][100] = &arrayofstrings;

不是用arrayofstrings陣列的第一個元素初始化pointer,而是pointer將指向整個2D陣列arrayofstrings。這就是為什么,當使用pointer訪問元素時,你需要在它周圍加上括號-

`(*pointer)[0]` -> first string
`(*pointer)[1]` -> 第二個字串等等。

這是個好方法嗎?是否有更簡單的方法?

如果你想要指向陣列arrayofstrings的第一個元素的指標,那么你可以這樣做

char (*p)[100] = & arrayofstrings[0] 。

或者

char (*p)[100] = arrayofstrings;

&arrayofstrings[0]arrayofstrings都是等價的1)

把它傳遞給一個函式,然后訪問陣列:

function()函式簽名應該是-

int function (char (*pointer) [100])
//如果你想讓函式知道行數,請為它添加一個引數 -//int function (char (*pointer)[100], int rows)

這等同于

int function (char pointer[][100]) 

并從main()函式中呼叫它,像這樣 -

function (p);

function()函式中,你可以以p[0], p[1] ...的方式訪問陣列:

用于演示的示例程式:

#include <stdio.h>/span>
#include <string.h>

#define ROW 3
#define COL 100

void function (char (*p) [COL]) {
    strcpy (p[0], "string one"/span>)。
    strcpy (p[1], "string two") 。
    strcpy (p[2], "string three");
}

int mainvoid {
    char arrayofstrings[ROW][COL] = {0};
    char (*pointer)[COL] = &arrayofstrings[0] 。

    函式(pointer)。

    for (size_t i = 0; i < ROW;   i) {
        printf ("%s
", arrayofstrings[i])。)
    }

    return 0;
}
  1. 當你訪問一個陣列時,它被轉換為第一個元素的指標(有少數例外情況,這個規則)。

uj5u.com熱心網友回復:

C字串函式希望緩沖區是空尾的。你的arrayofstrings分配發生在堆疊中。根據你的編譯器,它可能被初始化為所有的零,也可能包含垃圾。

在你的情況下,確保字串函式不會溢位你的緩沖區的最簡單方法是將每個緩沖區的第一個字符設定為0(空)

arrayofstrings[0][0] =0x00。 arrayofstrings[1][0] = 0x00; arrayofstrings[2][0] = 0x00

這將給你3個,100個字符的緩沖區,包含一個有效的空 "字串"。注意,你只能存盤99個 "字符",因為最后一個字符必須是0x00(空結束符)。

char (*pointer)[3][100] = &arrayofstrings;

這是不需要的。

關于C語言中的陣列,需要記住的是,[]索引的存在實際上只是為了讓人類程式員的作業更輕松。任何陣列定義都只是一個指向記憶體的指標。[][]...[]索引內的值和型別被編譯器用來在堆疊中分配正確的記憶體量,并做一些簡單的數學計算,為你想要訪問的元素提供正確的記憶體地址。

char arrayofstrings[3][100] 。

這將在堆疊中分配sizeof(char)*3*100位元組,并給你一個名為'arrayofstrings'的char*。這個char*本身并沒有什么特別之處。如果你有char arrayofstrings[300]或者char arrayofstrings[3][10][10]甚至long arrayofstrings[75](char是1位元組,long是4位元組),它將是同一個指標。

因為你用[a][b]把它宣告為一個多維陣列,當你要求arrayofstrings[x][y]時,編譯器會計算((x*b) y)*sizeof(type)并把它加到arrayofstrings的指標上,得到你要的值的地址。但由于它只是一個指標,你可以像對待其他指標一樣對待它,并將它傳遞給其他型別的指標,或者用它做指標數學運算。

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322489.html

標籤:

上一篇:自我參考的結構宣告

下一篇:如何將IQueryable轉換為顯示回傳資料的串列?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more