因此,经过一些搜索和谷歌搜索后,我无法弄清楚如何在char数组中的两个标记之间提取值。这是我的一些代码:
char *data= (char *) malloc( 50);
strcpy(data, "123 123 123 abcdef/456->ghijklm/789 123 123");
我需要将“abcdef”提取为Str1,将“ghijkm”提取为Str2。
每个人都推荐的第一个解决方案如下:
str1 = strtok(temp, "/"); // str1=abcdef
但是那个怎么样?我的意思是str2,所以。
Q1:我如何将ghijkmn提取为str2?
Q2:我可以利用其他现有的实用功能吗?或任何其他解决这种情况的解决方案?
[添加了:] 我需要的是所有用白色空格分隔的字符串。除了一个不同之外,所有“123”都是所需的格式。如上所述,我只需要它的两部分。
答案 0 :(得分:2)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *between(const char *str, char start, char end){
//return between start and end. However, start and end are not included.
const char *s = NULL, *e;
if(!str || !*str) return NULL;
if((e = strchr(str+1, end)) == NULL)
return NULL;//end character not found
for(int i = e-str-1; i >= 0; --i){
if(str[i] == start){
s = str + i + 1;
break;
}
}
if(!s)
return between(e, start, end);//start character not found
int len = e - s;
char *ret = malloc(len + 1);
if(ret){
memcpy(ret, s, len);
ret[len] = 0;
}
return ret;
}
int main(void){
const char *data = "123 123 123 abcdef/456->ghijklm/789 123 123";
char *str1 = between(data, ' ', '/');
if(str1){
printf("str1: '%s'\n", str1);
char *str2 = between(data, '>', '/');//use strstr+strlen+1 for after str1, or save search position
if(str2)
printf("str2: '%s'\n", str2);
free(str1);free(str2);
}
return 0;
}
答案 1 :(得分:1)
#include <stdio.h>
int main(void)
{
char text[]="123 123 123 abcdef/456->ghijklm/789 123 123";
char* ptr = strtok(text, " ");
char* slash;
char* str1;
char* str2;
while(ptr)
{
if (slash = strstr(ptr, "/"))
{
*slash = '\0';
str1 = ptr;
ptr = ++slash;
break;
}
ptr = strtok(NULL, " ");
}
str2 = strtok(ptr, ">");
while(ptr)
{
if (slash = strstr(ptr, "/"))
{
*slash = '\0';
str2 = ptr;
break;
}
ptr = strtok(NULL, " ");
}
printf("Found a: %s; and b: %s\n", str1, str2);
return 0;
}
<强> 输出 强>
Found a: abcdef; and b: ghijklm
答案 2 :(得分:1)
因此,根据我的理解,您只想从char []
数组中提取完全字母的字符串。如果是这种情况,您可以使用strtok
解析单词,并使用<ctype.h>
中的isalpha
测试字符串是否包含所有字母。
这样的事情可行:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int
main(int argc, char *argv[]) {
char data[] = "123 123 123 abcdef/456->ghijklm/789 123 123";
char *word;
const char *delim = " /->";
int i, validlet, strnum = 1;
word = strtok(data, delim);
while (word) {
validlet = 0;
for (i = 0; word[i]; i++) {
if (!isalpha(word[i])) {
break;
}
validlet++;
}
if (validlet == strlen(word)) {
printf("Found str %d: %s\n",strnum, word);
strnum++;
}
word = strtok(NULL, delim);
}
return 0;
}
答案 3 :(得分:1)
因此,如果您想要所有字符串以及其中一个字符串的某些部分,那么当且仅当&#39; abcdef / 456-&gt; ghijklm /的位置时,您才能使用以下代码段789 &#39;在 数据 数组中已修复:
//data ="123 123 123 123 123 123 123" abcdef/456->ghijklm/789 123");
char temp[/*strlen(data)*/];
char temp2[/*strlen(data)*/];
char *splitPtr, *p, *abcdef, *ghijklm, _789;
splitPtr = data;
splitCounter = 0;
for (char *p = strtok_r(data, " ", &splitPtr); p; p = strtok_r(NULL, " ", &splitPtr)) {
if (splitCounter == _the_location_of_special_text) {
strcpy(temp, p);
abcdef = strtok(temp, "/");
char *gt = strchr(p, '>')+1;
int index = (int)(gt - p);
strcpy(temp2, p+index);
ghijklm = strtok(temp2, "/");
_789 = strrchr( p, '/' )+1;
}
else {
//use the p as 123
}
splitCounter += 1;
}
printf ("Part 1: %s\n,Part 2: %s\n,Part 3: %s\n", abcdef, ghijklm , _789);
输出:
第1部分:abcdef
第2部分:ghijklm
第3部分:789