strtok函数只能提取数组定义的字符串吗?

朋友们,我今天写了段代码,想获取字符串最后一个单词的长度,字符串中单词用空格分割,我的思路是将字符串截取后获得最后一个单词,然后计算其长度即可:

int getLastWordLength(){
//    char target;
//    scanf("%s", &target);
//    if (strlen(&target) < 0 || strlen(&target) > 5000)
//        return 0;
    char target[30]="noelll 1234qwe";
    char* current;
    current = strtok(target, " ");
    printf("target = %s", target);
    printf("current = %s\n", current);
    char temp[20];
    strcpy(temp, current);
    printf("temp's length = %d\n",strlen(temp));
    while (current != NULL) {
        if (strlen(current) > strlen(temp)) {
            strcpy(temp, current);
        }
        //printf("current = %s\n", current);
        current = strtok(NULL, " ");
    }
    printf("%d\n", (int)strlen(temp));
    return 0;
}

如果target是控制台输入的,我代码最后只能输出第一个单词的长度,while只执行一次,然后current就是NULL了,没有截取到第二个单词,但是8,我改成数组把代码写死,就可以正确输出。请问这是strtok这个函数只能截取数组定义的字符串吗?
如果是实现我上面的效果,请问有什么方法吗?

回复
阅读 428
2 个回答
//    char target;
//    scanf("%s", &target);
    char target[30];
    scanf("%s", target);

scanf 的 target 只有一个字符的空间肯定是不行的。如果控制台输入的长度可能大于 30 ,数组定义也得相应地改得更长。

解决了,有两个地方需要注意:

  1. char target
    需要改成char target[30];,不然只能够读取到字符串的第一个字符。
  2. scanf()
    正确读入一行包含空格的字符串,scanf匹配需要使用这种正则表达式:scanf("%[^\n]", &target);[^\n]表示只有回车才读取结束,而%s读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)就结束。

下面给一张完整代码图和调试过程,可以看见target字符串的实际内容:

image.png

推荐问题
宣传栏