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