在C中提取一个子string

我想提取用户名从这个uri字段在ANSI C代码在Linux上使用gcc

mail:username@example.com 

所以我需要删除邮件:和@后的所有内容。 C中有没有内build函数来提取子string?

 char *uri_field = "mail:username@example.com"; char username[64]; sscanf(uri_field, "mail:%63[^@]", username); 

如果你在开始时可能有其他“垃圾”(不一定只是mail: ),你可以这样做:

 sscanf(uri_field, "%*[^:]:%63[^@]", username); 

你也可以使用strtok 。 看看这个例子

 /* strtok example */ #include <stdio.h> #include <string.h> int main () { char str[] ="mail:username@example.com"; char * pch; pch = strtok (str," :@"); while (pch != NULL) { printf ("%s\n",pch); pch = strtok (NULL, " :@"); } return 0; } 

希望能帮助到你。

 void getEmailName(const char *email, char **name /* out */) { if (!name) { return; } const char *emailName = strchr(email, ':'); if (emailName) { ++emailName; } else { emailName = email; } char *emailNameCopy = strdup(emailName); if (!emailNameCopy) { *name = NULL; return; } char *atSign = strchr(emailNameCopy, '@'); if (atSign) { *atSign = '\0'; // To remove the '@' // atSign[1] = '\0'; // To keep the '@' } if (*name) { strcpy(*name, emailNameCopy); } else { *name = emailNameCopy; } } 

这将创建一个指向字符串中的: character( colon )的指针。 (它不会复制字符串。)如果找到:指向后面的字符。 如果:不存在,只需使用字符串的开始(即不要使用mail:前缀)。

现在我们要从@开始去掉所有的东西,所以我们复制一个字符串( emailNameCopy ),然后切断@

代码然后在字符串内创建一个指向@字符(atSign)的指针。 如果@字符存在(即strchr返回非NULL),则@处的字符被设置为零,标记字符串的结尾。 (没有新的副本)

然后我们返回字符串,或者在给定缓冲区的情况下复制它。

另一种不依赖于任何特殊可能性并且容易检测错误的解决方案是下面的解决方案。 请注意,当函数extractUsername()成功时,您将不得不释放该字符串。

请注意,在C中,只需使用指针算术在字符序列中导航即可。 有一些标准的库函数,但它们比任何能够从字符串中提取信息更简单。

还有其他一些错误检测问题,例如多个“@”的存在。 但是这应该足够作为一个起点。

 // Extract "mail:username@example.com" #include <stdio.h> #include <stdlib.h> #include <string.h> const char * MailPrefix = "mail:"; const char AtSign = '@'; char * extractUserName(const char * eMail) { int length = strlen( eMail ); char * posAtSign = strrchr( eMail, AtSign ); int prefixLength = strlen( MailPrefix ); char * toret = (char *) malloc( length + 1 ); if ( toret != NULL && posAtSign != NULL && strncmp( eMail, MailPrefix, prefixLength ) == 0 ) { memset( toret, 0, length +1 ); strncpy( toret, eMail + prefixLength, posAtSign - prefixLength - eMail ); } else { free( toret ); toret = NULL; } return toret; } int main() { const char * test = "mail:baltasarq@gmail.com"; char * userName = extractUserName( test ); if ( userName != NULL ) { printf( "User name: '%s'\n", userName ); free( userName ); } else { fprintf( stderr, "Error: invalid e.mail address\n" ); return EXIT_FAILURE; } return EXIT_SUCCESS; }