检查字符串是否可以在C中变异

检查字符串是否可以在C中变异,c,arrays,string,constants,C,Arrays,String,Constants,假设我有这个功能: void f(char *s) { s[0] = 'x'; } 此函数有时会导致错误,有时不会。比如说, char *s = "test"; f(s); // Error char t[] = "test"; f(t); // Success 在函数f中,是否可以确定s[0]='x'在执行之前会导致错误吗?鉴于我收到的反馈,听起来我应该记录函数是否要求其参数是可变的。例如: #include <stdio.h> #include <string

假设我有这个功能:

void f(char *s) {
    s[0] = 'x';
}
此函数有时会导致错误,有时不会。比如说,

char *s = "test";
f(s); // Error

char t[] = "test";
f(t); // Success

在函数
f
中,是否可以确定
s[0]='x'在执行之前会导致错误吗?

鉴于我收到的反馈,听起来我应该记录函数是否要求其参数是可变的。例如:

#include <stdio.h>
#include <string.h>

char* f(char*);
void g(char*);

int main(int argc, char *argv[]) {
    // s is immutable.
    char *s = "test";
    puts(f(s));

    // t is mutable.
    char t[] = "test";
    g(t);
    puts(t);
}

/*
 * Returns a copy of the given string where the first character is replaced with 'x'.
 * Parameter s must contain at least one character.
 */
char* f(char *s) {
    char *t = strdup(s);
    t[0] = 'x';
    return t;
}

/*
 * Replaces the first character of the given sting with 'x'.
 * Parameter s must contain at least one character and be mutable.
 */
void g(char *s) {
    s[0] = 'x';
}
#包括
#包括
char*f(char*);
空g(字符*);
int main(int argc,char*argv[]){
//s是不变的。
char*s=“测试”;
(f(s));
//t是可变的。
字符t[]=“测试”;
g(t);
put(t);
}
/*
*返回给定字符串的副本,其中第一个字符替换为“x”。
*参数s必须至少包含一个字符。
*/
char*f(char*s){
char*t=strdup(s);
t[0]='x';
返回t;
}
/*
*用“x”替换给定钉尾的第一个字符。
*参数s必须至少包含一个字符并且是可变的。
*/
空g(字符*s){
s[0]='x';
}

调用方有责任遵守函数的要求,即参数可以更改,而不是相反

const char *s = "test";     //  tell compiler s is immutable
f(s);                       //  compilation error since f() requires a non-const argument

char t[] = "test";
f(t); // Success
阻止编译器拒绝上述f(s)的唯一方法是从s的声明中删除常量,或者丢弃常量。除极少数情况外,这两种情况都是问题的积极迹象


注意:在没有常量限定符的情况下可以声明s是语言中的一种异常。在需要的地方练习使用const(例如,当使用字符串文字初始化指针时)。很多程序错误都是通过这种方式消除的。

我不相信有任何可移植的方法可以做到这一点。不过,可能有一些特定于平台的技术。如果有人选择以显示未定义行为的方式使用您的函数,并且您的函数有很好的文档记录,这就在他们身上。尝试修改
常量
对象会导致未定义行为。实际上,这意味着你不能编写一个测试这个的函数。但是,您可以通过严格指定哪些对象是
const
,来获得编译时诊断,这样您就不会试图修改它们或将
const
对象传递给修改它的函数。@EOF:字符串文字不是
const
对象。但是由于特殊的大小写规则,修改字符串文字仍然有未定义的行为。@KeithThompson:是的。它实际上具有
const
语义。“…记录函数是否要求其参数可变…”这不是
const
发明的目的吗?@c-smile在本例中,函数
g
要求参数
s
为非常量。在这方面有没有办法使用
const
?如果是这样,请发布一个答案,我会接受。您的函数
g()
修改传递给它的字符串这一事实就是您所需要的全部文档。使用strdup()会导致内存泄漏,因此并不是解决此问题的切实可行的方法。