对于以下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]='-'
我如何理解这个问题?
答案 0 :(得分:1)
我在这个问题上详细讨论了这个问题:
Difference between declared string and allocated string
简而言之,无论 const
存储类修饰符,您声明字符串的方式都存储在RODATA(即:文本段)中,因此重新生成它非const
(你应该尽量避免的,因为没有合理的理由这样做)对你没有帮助。
在c中,如果要使缓冲区可选择地写入,请将其隐藏在上下文变量中或作为源文件中的静态变量,并且只允许通过私有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");
然后将其传递给函数。