由于某种原因,strtok 的指针只读取第一个字符串部分,并且在分隔符应用之后,它变为 NULL

For some reason strtok's pointer reads only the first string portion and afte the delimiter appiers, it becomes NULL

提问人:Chris04 提问时间:11/18/2022 最后编辑:BarmarChris04 更新时间:11/18/2022 访问量:29

问:

我想写的程序读取一个加密的单词并翻译它。首先,它创建一个 5x5 的 2d 数组,并将从 a 到 z 的字母放在单元格中,字母 j 除外。然后,它读取一串一次包含 2 个数字的对,并用符号“-”分隔它们。(字符串不允许超过 24 个字符)。程序获取字符串后,它会将其断开,以便指针一次获得 2 个数字中的一对,并在 atoi 的帮助下将这对变成一个 int。然后我们打破这对,并将其分成 2 个不同的数字。第一个数字代表我们想要的字母所在的 2d 数组的行,第二个数字表示我们想要的字母所在的 2d 数组的堆。然后程序获取这些坐标并在 2d 数组中找到与它们
相对应的字母。如果用户键入的数字大于 2d 的容量,则程序应写回“越界”,如果用户键入任何字母而不是数字,则应写回“无法解码”。

加密字示例:

12-04-20-20-23 = Hello

我们创建的 2d 数组:

X         0         1         2          3        4
0          a         b        c         d         e
1          f           g       h          i         k
2          l           m       n         o        p
3          q           r        s          t        u
4           v         w       x           y        z

对不起我的英语,我尽力解释。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
    int i,j;
    char k='a', arr[5][5];
    for (i=0; i<=4; i++)
    {
        for (j=0; j<=4; j++)
        {
            arr[i][j]= k;
            k= ++ k;
            if(k=='j')
                k= ++k;
        }
    }
    char str[74], *p, *h;
    gets(str);
    p=strtok(str,"-");
    h=strtok(str,"-");
    while(p!=NULL)
    {    
        if(atoi(p)/10>4||atoi(p)%10>4)
        {
            printf("Out of bounds");
            return 0;
        }
        else if (isalpha(*p))
        {
            printf("Unable to decode");
            return 0;
        }
        p=strtok(NULL,"-");  
    }
    while(h!=NULL)
    {
        printf("%c", arr[atoi(h)/10][atoi(h)%10]);  
        h=strtok(NULL,"-");
    }
    return 0;
}

例如:

12-04-20-20-23必须回馈社会'hello'

相反,它回馈社会'h'

12-61必须回馈:"Out of bounds"

回馈社会h

c 指针 while-loop null strtok

评论

0赞 Some programmer dude 11/18/2022
永远不要使用!它是如此危险,甚至已经从C语言中删除了。使用例如 相反。getsfgets
2赞 Some programmer dude 11/18/2022
至于你的问题,真的不应该吗?h=strtok(str,"-");h=strtok(NULL,"-");
0赞 Chris04 11/18/2022
我只想做一个 while 循环来检查加密的单词是否有任何错误,如果没有,那么如果加密的单词写正确,则进行一个 while 循环,让它用英语写单词。如果我这样做,p 不会在第一个 whie 循环中发生变化吗?

答:

0赞 nwellnhof 11/18/2022 #1
    p=strtok(str,"-");
    h=strtok(str,"-");

这是行不通的。 修改输入字符串,并且只能在给定输入上使用一次。strtok

评论

0赞 Barmar 11/18/2022
您应该解释解决方案是制作输入的副本,并使用它。