在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,这就是为什么为他编写错误代码是危险的。我觉得否决票和删除请求是不必要的苛刻;我的方法是自负的