Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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_Scanf - Fatal编程技术网

在C中分解字符串

在C中分解字符串,c,scanf,C,Scanf,我有一个包含两个名称和一个逗号的字符串。我如何将它们分开,并将它们写为分开的字符串。 范例 char *line="John Smith,Jane Smith"; 我正在考虑使用sscanf函数 sscanf(line,"%s,%s",str1,str2); 我该怎么办? 注意:我可以将逗号改为空格字符 我正在考虑使用sscanf函数 想都别想 char line[] = "John Smith,Jane Smith"; char *comma = strchr(line

我有一个包含两个名称和一个逗号的字符串。我如何将它们分开,并将它们写为分开的字符串。
范例

 char *line="John Smith,Jane Smith";    
我正在考虑使用sscanf函数

 sscanf(line,"%s,%s",str1,str2);    
我该怎么办?
注意:我可以将逗号改为空格字符

我正在考虑使用sscanf函数

想都别想

char line[] = "John Smith,Jane Smith";
char *comma = strchr(line, ',');
*comma = 0;
char *firstName = line;
char *secondName = comma + 1;
我正在考虑使用sscanf函数

想都别想

char line[] = "John Smith,Jane Smith";
char *comma = strchr(line, ',');
*comma = 0;
char *firstName = line;
char *secondName = comma + 1;

下面是如何使用strtok实现的:

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

int main() 
{
    // Your string.
    char *line = "John Smith,10,Jane Smith";

    // Let's work with a copy of your string.
    char *line_copy = malloc(1 + strlen(line));
    strcpy(line_copy, line);

    // Get the first person.
    char *pointer = strtok(line_copy, ",");    
    char *first = malloc(1 + strlen(pointer));
    strcpy(first, pointer);

    // Skip the number.
    strtok(NULL, ",");

    // Get the second person.
    pointer = strtok(NULL, ",");    
    char *second = malloc(1 + strlen(pointer));
    strcpy(second, pointer);

    // Print.
    printf("%s\n%s", first, second);

    return 0;
}
#包括
#包括
#包括
int main()
{
//你的绳子。
char*line=“约翰·史密斯,10岁,简·史密斯”;
//让我们使用字符串的副本。
char*line_copy=malloc(1+strlen(行));
strcpy(行\副本,行);
//找第一个人。
char*pointer=strtok(第w行,“,”);
char*first=malloc(1+strlen(指针));
strcpy(第一个,指针);
//跳过这个号码。
strtok(空,“,”);
//找第二个人。
指针=strtok(NULL,“”,“”);
char*second=malloc(1+strlen(指针));
strcpy(第二个,指针);
//印刷品。
printf(“%s\n%s”,第一个,第二个);
返回0;
}

以下是使用strtok的方法:

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

int main() 
{
    // Your string.
    char *line = "John Smith,10,Jane Smith";

    // Let's work with a copy of your string.
    char *line_copy = malloc(1 + strlen(line));
    strcpy(line_copy, line);

    // Get the first person.
    char *pointer = strtok(line_copy, ",");    
    char *first = malloc(1 + strlen(pointer));
    strcpy(first, pointer);

    // Skip the number.
    strtok(NULL, ",");

    // Get the second person.
    pointer = strtok(NULL, ",");    
    char *second = malloc(1 + strlen(pointer));
    strcpy(second, pointer);

    // Print.
    printf("%s\n%s", first, second);

    return 0;
}
#包括
#包括
#包括
int main()
{
//你的绳子。
char*line=“约翰·史密斯,10岁,简·史密斯”;
//让我们使用字符串的副本。
char*line_copy=malloc(1+strlen(行));
strcpy(行\副本,行);
//找第一个人。
char*pointer=strtok(第w行,“,”);
char*first=malloc(1+strlen(指针));
strcpy(第一个,指针);
//跳过这个号码。
strtok(空,“,”);
//找第二个人。
指针=strtok(NULL,“”,“”);
char*second=malloc(1+strlen(指针));
strcpy(第二个,指针);
//印刷品。
printf(“%s\n%s”,第一个,第二个);
返回0;
}


您可能想看看:Strtok()@JoeDF如果是该系列,那么
Strtok\u r()
(它本身并不线程不安全)。不要使用
Strtok
,它会修改字符串。当他使用一个字符串常量时,它将调用未定义的行为。您可能想看一下:Strtok()@JoeDF如果是这个族,那么
Strtok\u r()
(它本身并不线程不安全)。不要使用
Strtok
,它会修改字符串。当他使用一个字符串常量时,它将调用未定义的行为。实际上,名字之间有一个整数=>“john Smith,10,Jane Smith”。我想如果我知道如何只用两个字符串就可以完成它。但你的答案对我来说有点复杂(我是个初学者),你介意至少给我解释一下吗?@OssoBuko是的。您可以使用
strchr()
搜索逗号的位置,然后使用0覆盖它,0终止第一个字符串。然后你有你的第一个字符串。然后,您知道第二个字符串紧跟在逗号之后,所以您抓取一个指向它后面字符的指针(
comma+1
),然后,您也得到了第二个字符串。@OssoBuko;这是一个非常简单的答案,如果你有一些想法的话。对不起,伙计。我想我可以接受多个。我不知道这是错的。很抱歉让你头疼。实际上名字之间有一个整数=>“约翰·史密斯,10,简·史密斯”。我想如果我知道如何只用两个字符串就可以完成它。但你的答案对我来说有点复杂(我是个初学者),你介意至少给我解释一下吗?@OssoBuko是的。您可以使用
strchr()
搜索逗号的位置,然后使用0覆盖它,0终止第一个字符串。然后你有你的第一个字符串。然后,您知道第二个字符串紧跟在逗号之后,所以您抓取一个指向它后面字符的指针(
comma+1
),然后,您也得到了第二个字符串。@OssoBuko;这是一个非常简单的答案,如果你有一些想法的话。对不起,伙计。我想我可以接受多个。我不知道这是错的。很抱歉让你头疼。这在很多方面都是错误的。首先,有一个不必要的副本。您可以将
line
声明为数组。其次,没有为
line\u copy
分配内存,因此
strcpy()
加载到它会导致未定义的行为(这意味着这可能会崩溃,或者更糟糕的是,它可能会无声地失败,在其他地方造成更大、难以检测的问题)。此外,最好使用
strtok\u r()
而不是
strtok()
因为后者本质上是线程不安全的。好吧,我的代码不适合工业使用。我对它做了一些修改。但是,当Osso编写多线程程序时,我将使用strtok_r;他说他是一个绝对的初学者。@JosuéMolina,这就是为什么为他编写错误代码是危险的。我觉得否决票和删除请求是不必要的苛刻;我的方法在概念上是正确的。起初它是不安全的,但我并不认为这是错误的。不过,谢谢你的建设性批评;我学到了一些新东西。顺便说一下,我已经取消了我的否决票。但下层选民应该留下评论。这在很多层面上都是错误的。首先,有一个不必要的副本。您可以将
line
声明为数组。其次,没有为
line\u copy
分配内存,因此
strcpy()
加载到它会导致未定义的行为(这意味着这可能会崩溃,或者更糟糕的是,它可能会无声地失败,在其他地方造成更大、难以检测的问题)。此外,最好使用
strtok\u r()
而不是
strtok()
因为后者本质上是线程不安全的。好吧,我的代码不适合工业使用。我对它做了一些修改。但是,当Osso编写多线程程序时,我将使用strtok_r;他说他是一个绝对的初学者。@JosuéMolina,这就是为什么为他编写错误代码是危险的。我觉得否决票和删除请求是不必要的苛刻;我的方法是自负的