如何跟踪字符串长度?

时间:2017-01-24 13:36:33

标签: c printf

我有一个带命令行参数的函数:

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时,它只留下空格。我在这里错过了什么?

3 个答案:

答案 0 :(得分:2)

使用您的代码,字符串中的第一个Aa将在您的循环后为0,即空终止符。因此strlen将在触发null终止符后停止计算字符。

正如已经评论过的,size_t类型的正确格式说明符是%zu

另一件小事:为了更具可读性,您可以使用'A''a'减去字符串字符而不是“幻数”,例如

key[j] = key[j] - 'A';

答案 1 :(得分:2)

strlen会计算字符数,直到遇到\0字符为止。我猜你给的这个词包含 A a ?在这种情况下,您会在字符串中添加 0 strlen将停在那里。

答案 2 :(得分:2)

转换字符串后,您将Aa映射到00也恰好是字符串终止符的值,因此当您对转换后的字符串执行strlen时,它会在到达第一个A / a时停止计数

要跟踪长度,您需要记住转换前strlen的长度,并将其与缓冲区一起传递。