gpt4 book ai didi

C 字符串使用 strtok()、strcasecmp() 解析错误

转载 作者:行者123 更新时间:2023-11-30 15:36:51 25 4
gpt4 key购买 nike

所以我对 C 和整个字符串操作很陌生,但我似乎无法让 strtok() 工作。似乎每个人都有相同的 strtok 模板:

char* tok = strtok(source,delim);
do
{
{code}
tok=strtok(NULL,delim);
}while(tok!=NULL);

所以我尝试用空格键作为分隔符来做到这一点,而且 strtok() 似乎在第一次运行后不仅读取 NULL(第一个进入 while/do-while 的条目) )无论字符串有多大,但它似乎也破坏了源代码,将源字符串变成与 tok 相同的东西。

这是我的代码片段:

char* str;
scanf("%ms",&str);
char* copy = malloc(sizeof(str));
strcpy(copy,str);
char* tok = strtok(copy," ");
if(strcasecmp(tok,"insert"))
{
printf(str);
printf(copy);
printf(tok);
}

然后,这是输入“insert a b c d e f g”的一些输出

aaabbbcccdddeeefffggg

“插入”似乎完全消失了,我认为这是 strcasecmp() 的错误。另外,我想指出的是,我意识到 strcasecmp() 似乎将我的源字符串全部小写,我不介意。无论如何,输入“插入插入插入”绝对不会产生任何输出。就好像这些函数只会吃掉“插入”这个词,无论它出现多少次。我可能*最终只使用一些逐个字符读取字符串的 C 函数,但如果可能的话,我想避免这种情况。感谢一百万个人,我感谢您的帮助。

最佳答案

对于第二段代码,您有五个问题:第一是您的 scanf 函数的格式不标准, 'm' 应该做什么? (参见标准函数的 here for a good reference。)

第二个问题是您在指针上使用地址运算符,这意味着您将指针传递给指向char的指针(例如char**) 到 scanf 函数。如您所知,scanf 函数希望其参数作为指针,但由于字符串(无论是指向字符形式的指针还是数组形式)已经是指针,因此您不必使用地址运算符对于字符串参数。

解决了上一个问题后,第三个问题是指针str未初始化。您必须记住,未初始化的局部变量实际上是未初始化的,并且它们的值是不确定的。实际上,这意味着它们的值看起来是随机的。所以 str 将指向一些“随机”内存。

第四个问题与 malloc 调用有关,您在指针上使用 sizeof 运算符。这将返回指针的大小,而不是它所指向的内容。

第五个问题是,当您对指针copy执行strtok时,copy指向的内存内容未初始化。您为其分配内存(通常为 4 或 8 字节,具体取决于您使用的是 32 位还是 64 位平台,请参阅第四个问题),但您从未初始化它。

因此,仅四行代码即可解决五个问题。那就相当不错了! ;)

关于C 字符串使用 strtok()、strcasecmp() 解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22430485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com