當前位置:首頁 » 編程語言 » c語言字元數組函數參數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言字元數組函數參數

發布時間: 2022-02-08 00:28:13

c語言中,我寫了一個函數,參數是字元串數組,應該怎樣才可以在函數在獲取參數的長度.我怎麼弄都是4..

int length(const char *string1) //string是c++定義的類名
{int i = 0;
while (*string1++)
i++;
return i;
}

char a[2]; // 這是定義一個字元數組,不是一個字元串,內存中開辟2個位元組,後面的不管了
const char *a="12";//這才是一個字元串,內存中佔了3各位元組'1''2''\0' ,不一樣的!

❷ c語言字元串指針作函數參數。

fun函數裡面指針s=a傳遞的是函數地址,s在函數入口承接p指針值,之後接a,不改變p指針地址下的值!

❸ c語言,字元數組函數

#include<stdio.h>

/*比較兩個字元串*/
/*src、dst相等return1*/
/*src比dst短return-2*/
/*src比dst長return2*/
/*src、dst長度一致但不相等return-1*/
intstringCmp(char*src,char*dst){
if(strlen(src)<strlen(dst))
return-2;
elseif(strlen(src)>strlen(dst))
return2;
else{
while(*src&&*dst){
if(*src!=*dst)
return-1;
src++;
dst++;
}
return1;
}
}

/*合並兩個字元串*/
voidmergeString(char*str1,char*str2,char*merge){
while(*merge++=*str1++);/*復制str1並將指針移動到字元串的末尾的下一個位置*/
merge--;/*退到字元串的末尾*/
while(*merge++=*str2++);/*從末尾()的位置開始將str2拷貝進來*/
*merge='';
}

intmain(void){
char*str1_1="hel",*str1_2="lo",*merge1;
char*str2_1="ness",*str2_2="happy",*merge2;
char*str3_1="hi",*str3_2="hi",*merge3;
char*str4_1="hello",*str4_2="world",*merge4;

puts("第1組字元串:");
puts(str1_1);
puts(str1_2);

if(stringCmp(str1_1,str1_2)==1)
puts(str1_1);

elseif(stringCmp(str1_1,str1_2)==-2){
mergeString(str1_2,str1_1,merge1);
puts(merge1);
}

elseif(stringCmp(str1_1,str1_2)==2||stringCmp(str1_1,str1_2)==-1){
mergeString(str1_1,str1_2,merge1);
puts(merge1);
}

putchar(' ');
puts("======================================================");
putchar(' ');

puts("第2組字元串:");
puts(str2_1);
puts(str2_2);

if(stringCmp(str2_1,str2_2)==1)
puts(str2_1);

elseif(stringCmp(str2_1,str2_2)==-2){
mergeString(str2_2,str2_1,merge2);
puts(merge2);
}

elseif(stringCmp(str2_1,str2_2)==2||stringCmp(str2_1,str2_2)==-1){
mergeString(str2_1,str2_2,merge2);
puts(merge2);
}

putchar(' ');
puts("======================================================");
putchar(' ');

puts("第3組字元串:");
puts(str3_1);
puts(str3_2);

if(stringCmp(str3_1,str3_2)==1)
puts(str3_1);

elseif(stringCmp(str3_1,str3_2)==-2){
mergeString(str3_2,str3_1,merge3);
puts(merge3);
}

elseif(stringCmp(str3_1,str3_2)==2||stringCmp(str3_1,str3_2)==-1){
mergeString(str3_1,str3_2,merge3);
puts(merge3);
}

putchar(' ');
puts("======================================================");
putchar(' ');

puts("第4組字元串:");
puts(str4_1);
puts(str4_2);

if(stringCmp(str4_1,str4_2)==1)
puts(str4_1);

elseif(stringCmp(str4_1,str4_2)==-2){
mergeString(str4_2,str4_1,merge4);
puts(merge4);
}

elseif(stringCmp(str4_1,str4_2)==2||stringCmp(str4_1,str4_2)==-1){
mergeString(str4_1,str4_2,merge4);
puts(merge4);
}

putchar(' ');
puts("======================================================");
putchar(' ');

getch();/*屏幕暫留*/
return0;
}

運行結果

❹ c語言字元型數組傳入函數

在主函數裡面,sizeof是數組占的空間
在作為參數時,會被轉為指針
所以在函數裡面列印的是sizeof(char*)
對於任意指針,sizeof的值都是當前編譯器位數。你的是32位編譯器,輸出就是4
ps:4位元組=32位

❺ C語言,分別用字元數組和字元指針作函數參數兩種方法編程實現字元串

#include <stdio.h>
#include <string.h>
#include <malloc.h>

void niXuArr(char arr[]);
char * niXuPoint(char *p);

int main(void)
{
char arr[] = {"abcdefghigk"}, *p = "you are the first";
printf("逆序前:%s\n逆序後:", arr);
niXuArr(arr);
printf("%s\n", arr);

printf("逆序前:%s\n逆序後:", p);

p = niXuPoint(p);
printf("%s\n", p);
return 0;
}

void niXuArr(char arr[])
{
int i = 0;
char temp = 0;

for(i = 0; i < strlen(arr) / 2; i++)
{
temp = arr[i];
arr[i] = arr[strlen(arr) - 1 - i];
arr[strlen(arr) - 1 - i] = temp;
}
}

char * niXuPoint(char *p)
{
char *pHead = NULL, *pTail = NULL, temp = 0;

int i = 0;

pHead = (char*)malloc(strlen(p));
pTail = p + strlen(p) - 1;
p = pHead;

for(i = 0; i < strlen(p); i++)
{
*pHead++ = *pTail--;
}

*pHead = '\0';

return p;
}

❻ C語言 char 字元數組 和 字元指針 作為 函數參數 的區別

在C語言中,數組作為參數,進行傳遞時,傳遞的是指針 ,換句話說,字元數組作為參數,進行傳遞時,傳遞的是字元數組的起始地址,相當於一個字元指針,兩者沒有區別。比如下面的代碼:

#include<stdio.h>

voidf1(char*s){printf("%s ",s);}
voidf2(charsa[]){printf("%s ",sa);}

intmain()
{
charrsa[]="worldhello";
f1(rsa);
f2(rsa);
return0;
}

❼ c語言二維字元數組傳入函數的問題

既然只傳一行,幹嘛要用(*)[]型形參?用char *p或char p[]不就足夠了?另外,50x1000000的數組大了點,聲明全局數組吧,局部數組不支持。

❽ C語言中如何將二維字元數組作為函數參數引用傳遞

不可能達到目的。因為C語言中沒有引用這類型,C++才有。另,C/C++都不支持傳遞數組,只能傳遞數組的首元素或行指針,所以即使是C++,也只能傳遞數組指針的引用,而不可能傳遞數組的引用,因為數組沒有引用。

❾ C語言中關於字元數組做形參的問題~菜鳥求救~

1、字元串中以'\0'為結束符,你的str2中最後沒有結束符,所以會出現你所說的問題
解決方法
1)、可以在str2[13] = {0};定義時初始化為全0
2)、或者在執行conv(str1,str2);後str2[12] = '\0';

2、你將str2聲明成了char類型,與cnect中所需要的類型不匹配··

❿ c語言:字元串做為函數參數傳遞

1、值傳遞

void swap(int x,int y)

{ int temp = x;

x = y;

y = temp;

}void main()

{

int a = 10, b = 20;

swap(a, b);

}

執行後,並不會交換。

2、引用傳遞

void swap(int &x,int &y)

{ int temp = x;

x = y;

y = temp;

}void main()

{

int a = 10, b = 20;

swap(a, b);

printf("a=%d b=%d ", a, b);

}

執行後,發生交換。

3、指針傳遞

void swap(int *x,int *y)

{ int temp = *x; *x = *y; *y = temp;

}void main()

{

int a = 10, b = 20;

swap(&a, &b);

printf("a=%d b=%d ", a, b);

}

執行後,發生交換。

參數傳遞只有上面三種,但是如果加上數組,就會產生幾種新形式。

首先,明確數組型變數名本身只是該數組所佔存儲空間的首地址:

int a[3] = { 1, 2, 3 }; int *p = a; //等價於下行 //int *p = &a[0];

printf("%d", *p);

典型的數組做參數。

void fun(char s[]){ for (int i = 0; s[i] != ''; i++)

printf("%c", s[i]);

}void main()

{ char str[] = "Hello World!";

fun(str);

}

函數調用時,這里系統不會為形參分配數組存儲空間,而是僅僅分配一個存放數組地址(第一個元素地址)的存儲空間,此後,將實參數組的首地址傳遞給形參變數。

其實本質與下相同,只不過還是數組形式的(數組名代替指針)。

既然數組型變數名本身只是該數組所佔存儲空間的首地址,我們當然可以用指針做形參來接收數組實參。

void fun(char *p){ while (*p)

{

printf("%c", *p);

p++;

}

}void main()

{ char str[] = "Hello World!";

fun(str);

}

不過問題是如果這樣,無法把握數組結束(除非知道數組長度)。而對於字元數組(上例),由於字元串末尾有結束標志''(ascii碼正好是0),所以就很容易利用指針來判斷字元串是否結束。

(10)c語言字元數組函數參數擴展閱讀:

調用帶參數的函數:

在調用函數時,可以向其傳遞值,這些值被稱為參數。

這些參數可以在函數中使用。

可以發送任意多的參數,由逗號 (,) 分隔:

myFunction(argument1,argument2)。

當聲明函數時,請把參數作為變數來聲明:

function myFunction(var1,var2){這里是要執行的代碼}。

變數和參數必須以一致的順序出現。第一個變數就是第一個被傳遞的參數的給定的值,以此類推。

按值傳遞參數:

按值傳遞參數時,是將實參變數的值復制一個到臨時存儲單元中,如果在調用過程中改變了形參的值,不會影響實參變數本身,即實參變數保持調用前的值不變。

按值傳遞參數時,需要在參數名前加"ByVal"關鍵字。

按地址傳遞參數:

按地址傳遞參數時,把實參變數的地址傳送給被調用過程,形參和實參共用內存的同一地址。在被調用過程中,形參的值一旦改變,相應實參的值也跟著改變。

如果實參是一個常數或表達式,Visual Basic 6.0會按"傳值"方式來處理,按地址傳遞不需要"ByVal"關鍵字。

按數組傳遞參數:

在VB6.0中,允許使用數組作為實參傳遞到子過程的形參中,數組傳遞必須採用地址傳遞的方式來傳遞參數。數組參數在傳遞時應注意以下兩個方面:

① 在實參和形參列表中只寫數組名,忽略維數的定義,但圓括弧不能省,當數組作為參數傳遞時,系統將實參數組的起始地址傳給過程,使形參數組也具有與實參數組相同的起始地址,若參數是多維數組,每維以逗號分隔。

② 被調過程可分別通過Lbound和Ubound函數確定實參數組的下界和上界。

參考資料來源:網路-參數傳遞

參考資料來源:網路-字元串