【问题标题】:strtok - moving one place forwardstrtok - 向前移动一位
【发布时间】:2017-12-07 20:35:54
【问题描述】:

我有 myPrint 的功能,我正在尝试使用,但我认为我使用 strtok 功能错误

int myPrint( const  char* format , ...)
{
    char str[BUFFER];
    char cpy[BUFFER] = {0};
    char convert[BUFFER];
    char *check;
    char tempFormat[BUFFER];
    int len = 0;
    char *tempCheck;

    va_list args;
    va_start( args , format);   
    strcpy(tempFormat , format );

    check = strtok ( tempFormat , "%");

    int flag = 0;
    while( check != NULL)
    {
        strcat( cpy , check  );
        len = strlen( cpy );    

        switch(  tempFormat[len + 1]  )
        {
            case 'd':
                    sprintf( convert , "%d" , va_arg( args , int) );
                    strcat( cpy , convert);
                    break;
            case 'f':
                    sprintf( convert , "%f" , va_arg( args, double ));
                    strcat( cpy , convert);
                    break;
            case '%':
                    strcat( cpy ,"%" );
                    break;          
            case 's':
                    strcat( cpy ,va_arg( args , char* ) );
                    break;  
            default:
                break;              
        }
        check = strtok ( NULL  , "%");
    }

    printf("%s" , cpy);
    va_end( args);
}

void main()
{
    int x = 7;
    float y = 11;
    char str[] ="HELLo";
    char str2[]="MY NAME";

    myPrint ( "ss %d is %d %s  " , 7 , 6 , str);
}

问题是如果我发送到函数来打印我想要的东西,我会在每个% 之后得到d

有没有办法将strtok调用的结果向前移动一个位置?

【问题讨论】:

  • (check + 1)??
  • 如果我这样做,我会得到分段错误(核心转储)
  • 你需要检查你不是在最后,并且实际上有一个角色可以移动,例如if (*check && *(check + 1)) { /* then use check + 1 (or just check++) */ }
  • 做到了。没有帮助
  • 我们必须猜测BUFFER 足以容纳strcpy(tempFormat , format ); 然后check = strtok ( tempFormat , "%");指向组成字符串的字符直到第一个@987654332 @字符。 (strtok 将在解析期间将'%' 替换为'\0')。 If (check && *check && *(check + 1)) { /* then it is fine to use *(check + 1) -- which is the 2nd char in the string pointed to by check */ }

标签: c string strtok


【解决方案1】:

如果您想将strtok 移到最后一个匹配项之外,则需要为它提供一个新指针。我尝试了您的代码并进行了以下更改:

编辑: 我更新了整个代码,现在您可能更容易看到了!

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


#define BUFFER 500
int myPrint( const  char* format , ...)
{
    char str[BUFFER];
    char cpy[BUFFER] = {0};
    char convert[BUFFER];
    char *check;
    char *last_check;
    char tempFormat[BUFFER];
    int len = 0;
    char *tempCheck;

    va_list args;
    va_start( args , format);   
    strcpy(tempFormat , format );

    check = strtok (tempFormat , "%");

    int flag = 0;
    while( check != NULL)
    {
        strcat( cpy , check  );
        len = strlen(cpy);    

        switch(  tempFormat[len + 1]  )
        {
            case 'd':
                    sprintf( convert , "%d" , va_arg( args , int) );
                    strcat( cpy , convert);
                    break;
            case 'f':
                    sprintf( convert , "%f" , va_arg( args, double ));
                    strcat( cpy , convert);
                    break;
            case '%':
                    strcat( cpy ,"%" );
                    break;          
            case 's':
                    strcat( cpy ,va_arg( args , char* ) );
                    break;  
            default:
                break;              
        }
        int len = strlen(check);
        last_check = check;
        check = strtok (check+len+2 , "%");
    }

    strcat( cpy , last_check);
    printf("%s" , cpy);
    va_end( args);
}

void main()
{
    int x = 7;
    float y = 11;
    char str[] ="HELLo";
    char str2[]="MY NAME";

    myPrint ("ss %d is %d %s  " , 7 , 6 , str);
}

【讨论】:

  • 我试过你写的,但没有帮助解决问题
  • 它在我身边有效。你能报告你得到的输出是什么吗?我只跳过了last_check 的声明!
  • 另外,请务必删除 check = strtok ( NULL , "%"); 行,因为它已被替换。
  • 我确实将 cop 粘贴到您的代码中,并且在第二个 %d 之后打印废话。我想我替换了 strtok 并想到了一些新的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多