C 从字符指针检索最后一组输入值

C 从字符指针检索最后一组输入值,c,string,algorithm,pointers,C,String,Algorithm,Pointers,我在单个char*变量中有几个值集,如下所示: char* a1 = "1234 4567 789"; char* a2 = "123 445"; 它们之间用空格隔开 我试图从char*中检索最后一组值,如789和445,但我不太确定如何执行此操作 我目前正在这样做: trimmed[strchr(trimmed, ' ') - trimmed] = '\0'; 这只为我提供了第二组值,如果有两个以上的输入,则该值不起作用 是否有一种很好的方法来提取最终的值集,而不考虑是否有1个或3个输入?

我在单个char*变量中有几个值集,如下所示:

char* a1 = "1234 4567 789";
char* a2 = "123 445";
它们之间用空格隔开

我试图从char*中检索最后一组值,如789和445,但我不太确定如何执行此操作

我目前正在这样做:

trimmed[strchr(trimmed, ' ') - trimmed] = '\0';
这只为我提供了第二组值,如果有两个以上的输入,则该值不起作用


是否有一种很好的方法来提取最终的值集,而不考虑是否有1个或3个输入?

您可以使用
strtok
,它将根据模式分割字符串(本例中为空白)

可以使用返回上一次出现的指针的

#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;
}
#包括
#包括
内部主(空){
char*s=“1234 4567 789”;
char*s2=strrchr(s',);
如果(s2!=NULL)
printf(“%s\n”,s2+1);
返回0;
}
使用,您可以跟踪最后出现的空白,如下所示:

#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;
}
#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;
}
#包括
#包括
内部主(空){
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);
返回0;
}
输出:

789


或者,您可以这样使用(但不能与字符串文字一起使用):

#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;
}
#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;
}
#包括
#包括
内部主(空){
字符str[]=“1234 4567 789”;
字符*pch,*last_pch=str;
pch=strtok(str,“”);
while(pch!=NULL){
last_pch=pch;
pch=strtok(空,“”);
}
printf(“%s\n”,最后一个\u pch);
返回0;
}
输出:

789


这里我们实际上记住了最后一个
pch
,它实际上是一个子字符串令牌,我们不关心令牌的数量。

您可以手动编写相应的函数。比如说

#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" );
}    

请注意,您可能不会像这里的一些答案中所建议的那样,将标准函数
strtok
应用于字符串文字。

@Bocky这是一个错误的答案。您不能将strtok应用于字符串文字。您接受的答案是错误的。我用
strchr()
更新了我的答案。顺便说一句,+1.你应该使用
strrchr
而不是
strtok
strchr
。strchr的解决方案是错误的。考虑字符串仅包含一个数字时的情况。程序具有未定义的行为。函数strchr将返回NULL,循环后带有printf的语句将使用未初始化的变量last_idx.Oh dam,@vladfrommosco当然你是对的。我用索引的初始值更新了我的答案,这将解决这种情况!谢谢你(我将为你的另一个答案投票,因为我已经在这里为这一个作为礼物投票了)。我同意最后一句话。@Bocky一点也不同意。我们初学者应该互相帮助。:)