修改C中函数中的字符串

时间:2018-01-31 20:05:50

标签: c string

我试图弄清楚为什么这不起作用,但我不确定。

void main(void){ 
    char* s = "aBCde F. hjiodhfvev, . efof Gh";
    to_lower_case(s); 
    printf("%s",s); 
}

函数to_lower_case()只是一个随机函数,它的名字就是它的名字。我想这与声明为constant的字符串有关。

2 个答案:

答案 0 :(得分:2)

这是问题

char* s = "aBCde F. hjiodhfvev, . efof Gh";

字符串文字(引号中的字面值)是只读的。你无法修改它们。

您应该将其声明为

char s[] = "aBCde F. hjiodhfvev, . efof Gh";

答案 1 :(得分:1)

正确。以字符串文字形式提供的字符串是只读的。您需要先将字符串复制到可变内存:

char* s_readonly = "foobar";
size_t s_length = strlen( s_readonly );
char* s_mutable = malloc( s_length + 1 );
assert( s_mutable );
errno_t err = strcopy_s( s_mutable, s_length, s_readonly );
assert( err == 0 );
to_lower_case( s_mutable ); 
puts( s_mutable );
free( s_mutable );
  • 我的代码对堆执行显式复制。通过将字符串文字指定为char[n]类型,可以使此代码更简单。这样做的好处是允许静态sizeof()工作,O(1)strlen更快O(n)
  • printf("%s\n", s)可以替换为puts,速度更快,因为没有要解析的格式字符串。
  • 我对不安全的strcopy_s使用strcopy。始终检查返回的错误代码!
  • 并始终在free之后致电malloc。如果您正在处理短字符串,则可以使用alloca代替free更快,并且不需要使用char s_mutable[] = "foobar"; to_lower_case( s_mutable ); puts( s_mutable );

或者,就是这样:

s_mutable

这里的优势(除了简洁性)是sizeof( s_mutable ) == 12可以立即变异,这意味着$q="SELECT COUNT(pro_likes.product) AS likes FROM pro_likes LEFT JOINT products ON pro_likes.product = products.pro_id"; $r=mysqli_query($con,$q); $r1=mysqli_fetch_assoc($r); echo $r1['likes'];