将const char *传递给C函数

时间:2016-10-13 22:43:20

标签: c pointers char

对于以下question

  

编写一个函数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)。

因此,在调用(char[])之前,正在构建(cat)以使replace((char[])cat)成为(非const)可修改的缓冲区。因为,C是松散类型的

但该计划仍然在cat[i]='-'

进行细分

我如何理解这个问题?

2 个答案:

答案 0 :(得分:1)

我在这个问题上详细讨论了这个问题:

Difference between declared string and allocated string

简而言之,无论 const存储类修饰符,您声明字符串的方式都存储在RODATA(即:文本段)中,因此重新生成它非const(你应该尽量避免的,因为没有合理的理由这样做)对你没有帮助。

中,如果要使缓冲区可选择地写入,请将其隐藏在上下文变量中或作为源文件中的静态变量,并且只允许通过私有API调用访问它(即:&#34; getter&#34; /&#34; setter&#34;功能)。

答案 1 :(得分:0)

"" 内的字符串称为字符串字面量。这些是不可变的。 所以,而不是

 const char *cat = "The cat sat";

你可以写:

char cat[20]; // This or calloc/malloc. Your choice
strcpy(cat, "The cat sat"); 

然后将其传递给函数。