如何检测字符串文字到C中的函数的传递?

Sie*_*geX 5 c string literals

我试图chomp()在C中实现perl 函数的eqivilent版本,并且我遇到了一个角落案例,其中作为参数传递的字符串文字将导致分段错误(理所当然).

chomp("some literal string\n");

在C99中是否有一个定义的方法来检测是否我的函数传递了一个字符串文字,以便我可以return不尝试NUL它?

char* chomp(char *s)
{
    char *temp = s;

    if (s && *s)
    {
        s += strlen(s) - 1;
        if (*s == '\n')
        {
            *s = '\0';
        }
    }
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

Ano*_*on. 5

在C99中是否有一个定义的方法来检测是否我的函数传递了一个字符串文字,以便我可以返回而不尝试NUL它?

你不应该.

您的API不应该尝试为调用者捏造东西,只是让它稍后破坏.如果呼叫者违反规则,他们应该在那里找到.

如果调用者将不可变的字符串传递给期望可变字符串的函数,则它应该是段错误的.其他任何东西都是糟糕的设计.

(附录:当然,最好的设计是返回调用者负责释放的字符串副本.)