在C中提取字符串(子字符串)的特定部分
Extracting a Certain portion of a String (Substring) in C
我正在尝试从使用 C 语言存储为 char 数组的字符串中提取商店名称。每个字符串都包含商品的价格及其所在的商店。我有很多遵循这种格式的字符串,但我在下面提供了几个例子:
199 at Amazon
139 at L.L.Bean
379.99 at Best Buy
345 at Nordstrom
如何从这些字符串中提取商店名称?
提前谢谢你。
const char *sought = "at ";
char *pos = strstr(str, sought);
if(pos != NULL)
{
pos += strlen(sought);
// pos now points to the part of the string after "at";
}
else
{
// sought was not find in str
}
如果您想提取 pos
之后的一部分,而不是整个剩余的字符串,您可以使用 memcpy
:
const char *sought = "o ";
char *str = "You have the right to remain silent";
char *pos = strstr(str, sought);
if(pos != NULL)
{
char word[7];
pos += strlen(sought);
memcpy(word, pos, 6);
word[6] = '[=11=]';
// word now contains "remain[=11=]"
}
正如评论中已经指出的那样,您可以使用标准函数 strstr
。
这是一个演示程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char * extract_name( const char *record, const char *prefix )
{
size_t n = 0;
const char *pos = strstr( record, prefix );
if ( pos )
{
pos += strlen( prefix );
while ( isblank( ( unsigned char )*pos ) ) ++pos;
n = strlen( pos );
}
char *name = malloc( n + 1 );
if ( name )
{
if ( pos )
{
strcpy( name, pos );
}
else
{
*name = '[=10=]';
}
}
return name;
}
int main(void)
{
const char *prefix = "at ";
char *name = extract_name( "199 at Amazon", prefix );
puts( name );
free( name );
name = extract_name( "139 at L.L.Bean", prefix );
puts( name );
free( name );
name = extract_name( "379.99 at Best Buy", prefix );
puts( name );
free( name );
name = extract_name( "345 at Nordstrom", prefix );
puts( name );
free( name );
return 0;
}
程序输出为
Amazon
L.L.Bean
Best Buy
Nordstrom
函数extract_name
动态创建一个字符数组,用于存储提取的名称。如果内存分配失败,函数 returns 一个空指针。如果名称前的前缀(在本例中为字符串 "at "
)未找到,则函数 returns 为空字符串。
我正在尝试从使用 C 语言存储为 char 数组的字符串中提取商店名称。每个字符串都包含商品的价格及其所在的商店。我有很多遵循这种格式的字符串,但我在下面提供了几个例子:
199 at Amazon
139 at L.L.Bean
379.99 at Best Buy
345 at Nordstrom
如何从这些字符串中提取商店名称? 提前谢谢你。
const char *sought = "at ";
char *pos = strstr(str, sought);
if(pos != NULL)
{
pos += strlen(sought);
// pos now points to the part of the string after "at";
}
else
{
// sought was not find in str
}
如果您想提取 pos
之后的一部分,而不是整个剩余的字符串,您可以使用 memcpy
:
const char *sought = "o ";
char *str = "You have the right to remain silent";
char *pos = strstr(str, sought);
if(pos != NULL)
{
char word[7];
pos += strlen(sought);
memcpy(word, pos, 6);
word[6] = '[=11=]';
// word now contains "remain[=11=]"
}
正如评论中已经指出的那样,您可以使用标准函数 strstr
。
这是一个演示程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char * extract_name( const char *record, const char *prefix )
{
size_t n = 0;
const char *pos = strstr( record, prefix );
if ( pos )
{
pos += strlen( prefix );
while ( isblank( ( unsigned char )*pos ) ) ++pos;
n = strlen( pos );
}
char *name = malloc( n + 1 );
if ( name )
{
if ( pos )
{
strcpy( name, pos );
}
else
{
*name = '[=10=]';
}
}
return name;
}
int main(void)
{
const char *prefix = "at ";
char *name = extract_name( "199 at Amazon", prefix );
puts( name );
free( name );
name = extract_name( "139 at L.L.Bean", prefix );
puts( name );
free( name );
name = extract_name( "379.99 at Best Buy", prefix );
puts( name );
free( name );
name = extract_name( "345 at Nordstrom", prefix );
puts( name );
free( name );
return 0;
}
程序输出为
Amazon
L.L.Bean
Best Buy
Nordstrom
函数extract_name
动态创建一个字符数组,用于存储提取的名称。如果内存分配失败,函数 returns 一个空指针。如果名称前的前缀(在本例中为字符串 "at "
)未找到,则函数 returns 为空字符串。