【问题标题】:Passing const char * to a C function将 const char * 传递给 C 函数
【发布时间】:2016-10-13 22:43:20
【问题描述】:

对于下面的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)。

所以,在调用 replace((char[])cat) 之前,我正在强制转换 ((char[])) 以使 cat 成为(非 const)可修改缓冲区。因为,C 是松散类型的

但程序仍然在cat[i]='-'进行分段

我如何理解这个问题?

【问题讨论】:

  • "make cat a (non-const)modifiable buffer," 通过强制转换然后调用 replace() 调用未定义的行为 - 它可能有效,也可能无效。最好将cat 指向的数据复制到可修改的缓冲区中,然后调用replace()
  • @chux 可能有用吗?我想接听电话(char[])cat
  • 你给的练习是错误的:没有办法改变字符串文字,所以练习是不可能的。他们应该将其更改为 char cat[] = "The cat sat"; 以使练习正确。
  • @interjay 得到你的确认。你帮了我
  • char * 与您在问题中所说的const char * 不同

标签: c pointers char


【解决方案1】:

我在这个问题中详细介绍了这个问题:

Difference between declared string and allocated string.

简而言之,你声明字符串的方式,不管const存储类修饰符,都存储在RODATA中(即:文本段),所以重新转换为非-const(你应该尽量避免这样做,因为这样做的正当理由很少)对你没有帮助。

中,如果您想使缓冲区选择性可写,请将其隐藏在上下文变量中或作为源文件中的静态变量,并且只允许通过私有 API 调用访问它(即:“ getter"/"setter" 函数)。

【讨论】:

  • 不确定,如何使用 C 将 getter 设为私有?在 Java 中,这很容易。什么是上下文变量?
  • 稍后我将附上一个使用不透明 struct 的示例。
【解决方案2】:

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

 const char *cat = "The cat sat";

你可以写:

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

然后将 this 传递给函数。

【讨论】:

  • 出于安全原因,请使用 strncpy(具有最大复制长度的 strcpy),以避免缺少“\0”字符串的错误
猜你喜欢
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 2012-07-26
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
相关资源
最近更新 更多