簡體   English   中英

將 const char * 傳遞給 C 函數

[英]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 (您應該嘗試避免這種情況,因為在那里這樣做的一些正當理由)對您沒有幫助。

,如果要使緩沖區可選擇性寫入,請將其隱藏在上下文變量中或作為源文件中的靜態變量隱藏,並僅允許通過私有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM