[英]Passing const char * to a C function
對於以下問題,
編寫一個函數
replace
,它將一個指向字符串的指針作為參數,用減號替換該字符串中的所有空格,並提供它替換的空格數。因此
char *cat = "The cat sat"; n = replace( cat );
應該設置
cat to "The-cat-sat"
和
n to 2.
在上面的問題中, char *cat="That cat sat"
只不過是const char *cat="That cat sat"
這是我針對此問題的非工作代碼,
#include<stdio.h>
int replace(char[]);
int main(void){
const char *cat = "The cat sat";
int n = replace((char[])cat);
printf("\n Now the output is: \"%s\"", cat);
printf("n is %d", n);
}
int replace(char cat[]){
int count =0;
for(int i =0; cat[i] != '\0'; i++){
if(cat[i] == ' ') {
cat[i] = '-';
count++;
}
}
return count;
}
要分析此代碼,
const char *cat
指向一個無法修改的緩沖區( The cat sat
)。
因此,在調用replace((char[])cat)
之前,我正在轉換 ( (char[])
) 以使cat
成為(非常量)可修改的緩沖區。 因為,C 是松散類型的
但是程序仍然在cat[i]='-'
處分段
我如何理解這個問題?
我將在以下問題中詳細討論這個問題:
簡而言之,不管const
存儲類修飾符如何,聲明字符串的方式都存儲在RODATA(即文本段)中,因此將其重新廣播為非const
(您應該嘗試避免這種情況,因為在那里這樣做的一些正當理由)對您沒有幫助。
在c中 ,如果要使緩沖區可選擇性寫入,請將其隱藏在上下文變量中或作為源文件中的靜態變量隱藏,並僅允許通過私有API調用(即:“ getter” /“ setter”)訪問它“ 職能)。
"" 內的字符串稱為字符串文字。 這些是不可變的。 所以,而不是
const char *cat = "The cat sat";
你可以寫:
char cat[20]; // This or calloc/malloc. Your choice
strcpy(cat, "The cat sat");
然后將其傳遞給函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.