#include <stdio.h>
void f1(char* str, int index)
{
*(str + index) &= ~32;
}
int main()
{
char arr[] = "gatecsit";
f1(arr, 0);
printf("%s", arr);
return 0;
}
功能 f1()如何工作?
特定的 *(str + index)&amp; =〜32; 这个....
感谢
答案 0 :(得分:1)
我认为f1()通过利用ASCII的属性来大写字符串的第一个字母,这意味着相应的大小写字母相差32个。例如,'A'的代码是65,而''的代码是' a'是97.代码的'&amp; = ~32'位将转换为字符str [index]的ASCII表示的第5位,这应该将'g'变为'G'。对于只包含普通字母的字符串,这应该没问题,但会对数字和标点符号产生奇怪的影响。
答案 1 :(得分:1)
表达式
*(str + index)
相当于
str[index]
所以位置index
的角色按以下方式改变
*(str + index) &= ~32;
在ASCII表中,小写字母与大写字母不同,还有一个设置位。例如,小写字母'a'
的代码为十六进制61
,而大写字母'A"
的代码为十六进制41
。因此,差异等于十六进制中{16}的十进制值等于20
的值。
因此,原始表达式将字符中的相应位重置为0,将小写字母转换为大写字母。
答案 2 :(得分:1)
代码从字符中删除1位 从字节或0x20中有效地减去32。
#include <stdio.h>
#include <string.h>
void f1(char* str, int index)
{
// The code removes 1 bit from the character at the position `str[index]`
// effectively subtracting 32 from that character
// Capital letters in ASCII are apart by 32 (0x20) from small letters
// Since 'a' = 0x61 and 'A' = 0x41 'a' - 32 = 'A'
// Since 'b' = 0x62 and 'B' = 0x42 'b' - 32 = 'B'
// `~` is a binary negation operator 0 -> 1; 1 -> 0
// `&` is a binary AND
// x &= y; is equivalent to x = x & y;
// ~0x20 = 0b11011111
*(str + index) &= ~0x20; // 0x20 = 32;
}
int main()
{
int i;
char arr[] = "gatecsit";
size_t len = strlen(arr);
for(i = 0; i< len; i++)
printf(" %c " , arr[i]);
printf("\n");
for(i = 0; i< len; i++)
printf(" %X" , arr[i]);
printf("\n");
// convert all letters:
for(i = 0; i< len; i++)
f1(arr, i);
printf("\n");
for(i = 0; i< len; i++)
printf(" %c " , arr[i]);
printf("\n");
for(i = 0; i< len; i++)
printf(" %X" , arr[i]);
return 0;
}
输出: 小和大写是相隔0x20(或十进制32)的字母。 从这个打印输出中可以清楚地看到这一点:
g a t e c s i t
67 61 74 65 63 73 69 74
G A T E C S I T
47 41 54 45 43 53 49 54