Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
斯特托克在C中的怪异行为?_C_String_Strtok - Fatal编程技术网

斯特托克在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