C语言知识大复习 gbk2utf8
字符串常量的写法:
char *s = "hello world";
最好改写成 const char *s = "hello world";
因为修改其内容也会出错。
函数返回地址的区别:
函数返回地址,除了堆地址和字符串常量地址有意义。其他都无意义。
#include <stdio.h>
const char *getstr()
{
const char *s = "hello world"; //返回一个常量字符串地址是有效的
return s;
}
int main()
{
printf("%s\n",getstr());
return 0;
}
错误:
#include <stdio.h>
const char *getstr()
{
char s[100] = "hello world"; //返回一个栈上的地址是无意义的,因为函数结束即释放
return s;
}
int main()
{
printf("%s\n",getstr());
return 0;
}
++运算符你真的了解了吗
#include <stdio.h>
int main()
{
int i = 9;
int a = ++i++; //先计算i++,得到的值是没有内存存放的,无法作为左值。无法再++i
printf("%d\n",a);
}
编译时就直接出错。
gbk2utf8
int gbk2utf8(char *src, size_t *srclen, char *dest, size_t *destlen)
{
iconv_t cd = iconv_open("UTF8", "GBK"); //源字符串为GBK,目标UTF8
if (cd == (iconv_t) - 1)
{
printf("open iconv error %s\n", strerror(errno));
return -1;
}
size_t rc = iconv(cd, &src, srclen, &dest, destlen); //将src字符串转化为目标dest
if (rc == (size_t) - 1)
{
printf("iconv error %s\n", strerror(errno));
return -1;
}
iconv_close(cd);
return 0;
}