为什么memset采取int作为第二个参数,而不是一个char,而wmemset需要wchar_t的,而不是像long或long long?
试图创建一个简单的函数,在字符串中查找单个字符"就像strchr()会",我做了以下内容:
char* findchar(char* str, char c)
{
char* position = NULL;
int i = 0;
for(i = 0; str[i]!='\0';i++)
{
if(str[i] == c)
{
position = &str[i];
break;
}
}
return position;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止它的作用.但是,当我看到strchr()的原型时:
char *strchr(const char *str, int c);
Run Code Online (Sandbox Code Playgroud)
第二个参数是int?我很想知道..为什么不是炭?这是否意味着我们可以像使用char一样使用int来存储字符?
这让我想到第二个问题,我试图改变我的函数接受一个int作为第二个参数......但我不确定这样做是否正确和安全:
char* findchar(char* str, int c)
{
char* position = NULL;
int i = 0;
for(i = 0; str[i]!='\0';i++)
{
if(str[i] == c) //Specifically, is this line correct? Can we test an int against a char?
{
position = …Run Code Online (Sandbox Code Playgroud) 从:
man strchr
Run Code Online (Sandbox Code Playgroud)
char*strchr(const char*s,int c);
strchr()函数返回指向字符串s中第一次出现的字符c的指针.
这里"字符"表示"字节"; 这些函数不适用于宽字符或多字节字符.
如果我尝试搜索多字节字符é(0xC3A9在UTF-8中):
const char str[] = "This string contains é which is a multi-byte character";
char * pos = strchr(str, (int)'é');
printf("%s\n", pos);
printf("0x%X 0x%X\n", pos[-1], pos[0]);
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
这是一个多字节字符
0xFFFFFFC3 0xFFFFFFA9
尽管有警告:
警告:多字符字符常量[-Wmultichar]
所以这是我的问题:
strchr用于多字节字符?(它似乎工作,只要int类型足够大,包含你的多字节,最多4个字节)0xFFFFFF?我在查看链接数据类型的数据类型
它被写为char类型是1字节,范围是-128到127或0到255.
编辑:还有一个问题这个C代码有什么问题?.但这不是同一个问题.标题说这个代码有什么问题,搜索不会轻易列出这个答案.人们必须完全分析这个问题才能理解这个问题.
编辑:看了几个答案和评论后,我又有了疑问.双引号内的字符串被视为char.如果我将双引号字符串传递给具有signed char类型参数的函数,我会收到警告.itoa和许多其他库函数也使用char类型参数而不是signed char.当然,类型转换会避免这个问题.那么操作空终止字符串的函数的最佳参数类型是什么(例如LCD显示相关函数)?使用signed char或unsigned char(因为char是实现定义的,我猜它可能不是可移植的)