从char指针中检索最后一组输入值

时间:2016-03-10 08:42:49

标签: c string algorithm pointers

我在一个char *变量中有一些值,例如:

result= TestLinkAPIResults.TEST_PASSED; remove = TestLinkAPIResults.TEST_PASSED

它们被空白区分开。

我正在尝试从char *中检索最后一组值,例如789和445,但我不太清楚如何执行此操作。

我目前正在这样做:

char* a1 = "1234 4567 789";
char* a2 = "123 445";

这只会让我知道第二组值,如果有超过2个输入则不起作用。

是否有一个很好的方法来提取最终的价值集,无论是否有1个或3个输入?

4 个答案:

答案 0 :(得分:2)

您可以手动编写相应的功能。例如

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

char * extract( const char *s, size_t n )
{
    if ( n == 0 ) return NULL;

    while ( n != 0 && isspace( ( unsigned char )s[n-1] ) ) --n;
    while ( n != 0 && isdigit( ( unsigned char )s[n-1] ) ) --n;

    return ( char * )( isdigit( ( unsigned char )s[n] ) ? &s[n] : NULL );
}

int main( void ) 
{
    char *s1 = "1234 4567 789";
    char *s2 = "123 445";

    char *p1 = extract( s1, strlen( s1 ) );

    while ( p1 )
    {
        printf( "%d ", atoi( p1 ) );
        p1 = extract( s1, p1 - s1 );
    }        
    printf( "\n" );

    p1 = extract( s2, strlen( s2 ) );

    while ( p1 )
    {
        printf( "%d ", atoi( p1 ) );
        p1 = extract( s2, p1 - s2 );
    }        
    printf( "\n" );
}    

程序输出

789 4567 1234 
445 123 

考虑到您可能不会将标准函数strtok应用于字符串文字,因为在此处的某些答案中建议使用。:)

答案 1 :(得分:0)

您可以使用strtok,它会根据模式(在这种情况下为空格)分割字符串

char *a1 = "1234 4567 789";
char *ptr;
char *tmp = strtok(a1, " ");
while(tmp != NULL)
{
    ptr = tmp;
    tmp = strtok(NULL, " ");
}

//ptr holds now the last value

答案 2 :(得分:0)

您可以使用strrchr返回指向最后一次出现的指针。

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

int main (void) {
  char *s = "1234 4567 789";
  char *s2 = strrchr(s, ' ');
  if (s2 != NULL)
    printf("%s\n", s2 + 1);
  return 0;
}

答案 3 :(得分:0)

使用strchr(),您可以跟踪最后一次出现的空格,如下所示:

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

int main (void) {
  char *str = "1234 4567 789";
  char *pch;
  int last_idx = 0;
  pch = strchr(str, ' ');
  while (pch != NULL) {
    last_idx = pch-str+1;
    pch = strchr(pch+1,' ');
  }
  printf("%s\n", str + last_idx);
  return 0;
}

输出:

  

789

或者,您可以使用strtok()(但不能使用字符串文字),如下所示:

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

int main (void) {
  char str[] = "1234 4567 789";
  char *pch, *last_pch = str;
  pch = strtok (str, " ");
  while (pch != NULL) {
    last_pch = pch;
    pch = strtok (NULL, " ");
  }
  printf ("%s\n", last_pch);
  return 0;
}

输出:

  

789

这里我们实际上记得最后一个pch实际上是一个子字符串令牌而我们并不关心令牌的数量。