斯特托克在C中的怪异行为?
我在写一个程序,我想打印两个字符串之间的常用词。我用了两个循环,把这些字符串分成两个循环。但是没有得到必要的结果。然后我稍微改变了一下程序,然后我只研究了一次外循环。我不明白为什么?有人知道吗斯特托克在C中的怪异行为?,c,string,strtok,C,String,Strtok,我在写一个程序,我想打印两个字符串之间的常用词。我用了两个循环,把这些字符串分成两个循环。但是没有得到必要的结果。然后我稍微改变了一下程序,然后我只研究了一次外循环。我不明白为什么?有人知道吗 #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char str1[] = "Japan Korea Spain Germany Australia France ";
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char str1[] = "Japan Korea Spain Germany Australia France ";
char str2[] = "England USA Russia Italy Australia India Nepal France";
char *tar1 = strtok(str1," ");
char *tar2 = NULL;
while(tar1)
{
tar2 = strtok(str2," ");
while(tar2)
{
if(strcmp(tar1,tar2)) printf("%s %s\n",tar1 , tar2);
tar2 = strtok(NULL," ");
}
tar1 = strtok(NULL," ");
tar2 = NULL;
}
return 0;
}
#包括
#包括
#包括
int main()
{
char str1[]=“日本、韩国、西班牙、德国、澳大利亚、法国”;
char str2[]=“英国、美国、俄罗斯、意大利、澳大利亚、印度、尼泊尔、法国”;
char*tar1=strtok(str1,“”);
char*tar2=NULL;
while(tar1)
{
tar2=strtok(str2,“”);
while(tar2)
{
if(strcmp(tar1,tar2))printf(“%s%s\n”,tar1,tar2);
tar2=strtok(空,“”);
}
tar1=strtok(空,“”);
tar2=NULL;
}
返回0;
}
strtok()函数将字符串分解为零或多个序列
非空代币
换句话说:“
被strtok
替换为NUL(0)
因此,您不能使用tar2=strtok(str2,“”)使用同一字符串编码>两次
正如@WeatherVane所指出的:您不能同时在两个不同的字符串上使用strtok
代码的替代方案:
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "Japan Korea Spain Germany Australia France ";
char str2[] = "England USA Russia Italy Australia India Nepal France";
char *tar = strtok(str1, " ");
char *ptr;
size_t sz;
while (tar) {
if ((ptr = strstr(str2, tar)) != NULL) {
/* First string or starts with " " */
if ((ptr == str2) || (*(ptr -1) == ' ')) {
sz = strlen(tar);
/* Last string or ends with " " */
if ((*(ptr + sz) == ' ') || (*(ptr + sz) == '\0')) {
puts(tar);
}
}
}
tar = strtok(NULL, " ");
}
return 0;
}
您不能同时在两个不同的字符串上使用strtok
,也不能多次解析字符串,因为strtok
已通过使用nul
终止符打断字符串来修改字符串
本例在检查匹配项之前,将令牌指针提取到每个输入字符串的指针数组中
#include <stdio.h>
#include <string.h>
#define MAXSTR 20
int main()
{
char str1[] = "Japan Korea Spain Germany Australia France ";
char str2[] = "England USA Russia Italy Australia India Nepal France";
char *tar1[MAXSTR];
char *tar2[MAXSTR];
char *tok;
int ind1 = 0, ind2 = 0;
int i, j;
tok = strtok(str1, " \t");
while(tok != NULL && ind1 < MAXSTR) {
tar1[ind1++] = tok;
tok = strtok(NULL, " \t");
}
tok = strtok(str2, " \t");
while(tok != NULL && ind2 < MAXSTR) {
tar2[ind2++] = tok;
tok = strtok(NULL, " \t");
}
for(i=0; i<ind1; i++) {
for(j=0; j<ind2; j++) {
if(strcmp(tar1[i], tar2[j]) == 0) {
printf("%s\n", tar1[i]);
break;
}
}
}
return 0;
}
if(strcmp(tar1,tar2))
…确定吗?如果存在匹配项,if
将为FALSE…您不能同时在两个不同的字符串上使用strtok
。我建议strtok_s
或strtok_r
以可用的为准。即使这样,您也只能解析每个字符串一次,而不是在您希望的嵌套循环中。您需要首先将令牌指针提取到数组中,然后执行嵌套循环search.split以存储到数组,然后执行循环。因为strtok家族会更改字符串。嗨,Sourav,我提到我更改了程序。我知道我需要在那里放一个NOT(!)。非常感谢。也许提到strtok_r
,这可能会有所帮助。@phoxis我在问题下方顶部的评论中提到了这一点。但是,您只能对字符串进行一次标记,因此最好在比较之前对其进行标记。
#include <stdio.h>
#include <string.h>
#define MAXSTR 20
int main()
{
char str1[] = "Japan Korea Spain Germany Australia France ";
char str2[] = "England USA Russia Italy Australia India Nepal France";
char *tar1[MAXSTR];
char *tar2[MAXSTR];
char *tok;
int ind1 = 0, ind2 = 0;
int i, j;
tok = strtok(str1, " \t");
while(tok != NULL && ind1 < MAXSTR) {
tar1[ind1++] = tok;
tok = strtok(NULL, " \t");
}
tok = strtok(str2, " \t");
while(tok != NULL && ind2 < MAXSTR) {
tar2[ind2++] = tok;
tok = strtok(NULL, " \t");
}
for(i=0; i<ind1; i++) {
for(j=0; j<ind2; j++) {
if(strcmp(tar1[i], tar2[j]) == 0) {
printf("%s\n", tar1[i]);
break;
}
}
}
return 0;
}
Australia
France