我有一个带命令行参数的函数:
int main(int argc, string argv[])
我想存储我的参数,所以我声明了一个变量:
string key = argv[1];
它打算成为字符串,我希望将此字符串从ASCII转换为字母索引(' A' = 0,' B' = 1等) 。所以我这样去了
printf("key length %lu\n", strlen(key));
for (j = 0, n = strlen(key); j < n; j++)
{
if(isupper(key[j]))
{
key[j] = key[j] - 65;
}
else
{
key[j] = key[j] - 97;
}
}
printf("key length %lu\n", strlen(key));
但不知何故,这两个版画给了我不同的价值。好像第二个printf
似乎总是会给我1
。我无法弄清楚它为什么会发生。我可以使用key[j]
打印%i
,但是当我要求%c
时,它只留下空格。我在这里错过了什么?
答案 0 :(得分:2)
使用您的代码,字符串中的第一个A
或a
将在您的循环后为0
,即空终止符。因此strlen
将在触发null终止符后停止计算字符。
正如已经评论过的,size_t
类型的正确格式说明符是%zu
另一件小事:为了更具可读性,您可以使用'A'
和'a'
减去字符串字符而不是“幻数”,例如
key[j] = key[j] - 'A';
答案 1 :(得分:2)
strlen
会计算字符数,直到遇到\0
字符为止。我猜你给的这个词包含 A 或 a ?在这种情况下,您会在字符串中添加 0 ,strlen
将停在那里。
答案 2 :(得分:2)
转换字符串后,您将A
和a
映射到0
。 0
也恰好是字符串终止符的值,因此当您对转换后的字符串执行strlen
时,它会在到达第一个A
/ a
时停止计数
要跟踪长度,您需要记住转换前strlen
的长度,并将其与缓冲区一起传递。