【问题标题】:Retrieving last set of input values from a char pointer从 char 指针中检索最后一组输入值
【发布时间】:2016-06-24 23:57:45
【问题描述】:

我在单个 char* 变量中有几组值,例如:

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

它们由空格分隔。

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

我目前正在这样做:

trimmed[strchr(trimmed, ' ') - trimmed] = '\0';

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

无论输入是 1 个还是 3 个,是否有一种好方法可以提取最终的一组值?

【问题讨论】:

  • 您接受的答案是错误的。我用strchr() 的代码更新了我的答案。好问题顺便说一句,+1。
  • 您应该使用strrchr,它完全符合您的要求,而不是strtok 或strchr。

标签: c string algorithm pointers


【解决方案1】:

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

#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 应用于字符串文字,因为它在此处的一些答案中被建议。:)

【讨论】:

  • 我同意最后一句话。
  • @Bocky 完全没有。我们初学者应该互相帮助。:)
【解决方案2】:

您可以使用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

【讨论】:

  • @Bocky 这是一个错误的答案。您不能将 strtok 应用于字符串文字。
【解决方案3】:

使用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,它实际上是一个子字符串标记,我们不关心标记的数量。

【讨论】:

  • 用strchr的解决方案是错误的。考虑字符串只包含一个数字的情况。
  • 程序有未定义的行为。函数 strchr 将返回 NULL 并且循环后带有 printf 的语句将使用未初始化的变量 last_idx。
  • 哦该死的,@VladfromMoscow 当然你是对的。我用索引的初始值更新了我的答案,它将处理这种情况!谢谢(我将支持你的另一个答案,因为我已经在这里作为礼物这样做了)。
【解决方案4】:

您可以使用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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2022-01-06
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多