我有这个代码: 我如何用printf调试?
char *string = "something";
short i;
i = strlen(string);
while (i-- && (*(string+i)==' ' || *(string+i)=='\0'));
*(string+i+1) = '\0' ;
这是做什么的?
*(string+i)
答案 0 :(得分:3)
根据C标准,表达式e1[e2]
按照定义 等同于*(e1+e2)
。所以当你写
*(string + i)
等同于
string[i]
这个定义有一个有趣的副作用,实际上写3[s]
而不是s[3]
是正确的,因为operator []是可交换的。
答案 1 :(得分:1)
*(string+i)
是string[i]
。因此*(string+i) == '\0'
与string[i] == 0
相同。
这是因为pointer + number
与pointer + number * sizeof(type)
的地址相同(在您的情况下string + i
与string + i * sizeof(char)
相同。当您索引数组{{1}时}是地址arr[i]
的元素。
要使用arr + i * sizeof(type)
进行调试,只需插入printf
语句并查看变量内容即可。例如:
printf
答案 2 :(得分:1)
后缀运算符 - 表示i
将在下一个序列点之前进行评估然后递减。
&&运算符在左右操作数之间有一个序列点,因此在评估右操作数之前会出现i--
。
因此string+i
是指原始i - 1的值。
*(string+i)
保证与string[i]
完全等效。前者只是一种不太可读的形式。
代码做了一个特殊的检查。如果一个字符是空终止符,它会在第一个字符后面添加另一个空终止符。这没有任何意义。只有空间检查才有意义。
我也怀疑真正的意图是在空格后加一个null?难道你不想删除空间并在那里结束字符串吗?好像是个错误。
此外,代码效率低下,因为如果从头到尾计算并遇到第一个空格,则可以停止迭代。
换句话说,这段代码很糟糕。你应该用这样的东西替换它:
char* ptr = strchr(string, ' ');
if(ptr != NULL)
{
*ptr = '\0';
}