sscanf_s没有存储正确的模式

时间:2019-11-03 07:00:17

标签: c scanf

我只想要不带下划线的字符串。我尝试了以下几个代码,但都无法正常工作:

string是另一个函数的char指针,它看起来像这样:“” _I_have_1_dog.dat)“”

void func1(char *string)
{
char buffer[256]="";
unsigned long count = 0;
  1. count = sscanf_s(string, " \"%*c%255[^\"]\"", buffer, _countof(buffer));

输出: _I_have_1_dog.dat

  1. count = sscanf_s(string, " \"%*[^_]_%255[^\"]\"", buffer, _countof(buffer));

输出: _I_have_1_dog.dat

  1. count = sscanf_s(string, " \"[^_]_%255[^\"]\"", buffer, _countof(buffer));

输出: _I_have_1_dog.dat

  1. count = sscanf_s(string, " \"[^_]_%255[^\"]\"", buffer, _countof(buffer));

输出: _I_have_1_dog.dat

1 个答案:

答案 0 :(得分:0)

基于删除第一个字符'_'而不是全部'_'的编辑

删除前导'_'的最简单方法是,如果第一个字符是string,则将'_'中的所有字符向下移1。

您可以使用memmove中的string.h之类的功能来执行相同的操作。 (在单个函数调用中)但是,循环同样容易。

使用循环方法的简单功能可能是:

void rm_1st_underscore (char *string)
{
    int i = 1;      /* set index to 1 (2nd char in string) */

    if (*string != '_')             /* if 1st char not '_', just return */
        return;

    do                              /* loop over each char in string */
        string[i-1] = string[i];    /* shift chars back by 1 in string */
    while (string[i++] != 0);       /* (note: causes '\0' to copy) */
}

一个简短的例子是:

#include <stdio.h>

void rm_1st_underscore (char *string)
{
    int i = 1;      /* set index to 1 (2nd char in string) */

    if (*string != '_')             /* if 1st char not '_', just return */
        return;

    do                              /* loop over each char in string */
        string[i-1] = string[i];    /* shift chars back by 1 in string */
    while (string[i++] != 0);       /* (note: causes '\0' to copy) */
}

int main (void) {

    char str[] = "_I_have_1_dog.dat";

    rm_1st_underscore (str);

    puts (str);
}

使用/输出示例

$ ./bin/rmunderscore
I_have_1_dog.dat

仔细研究一下,如果您还有问题,请告诉我。如果您需要使用memmove进行尝试的帮助,请告诉我,我将删除另一个示例。

使用memmove

由于我们只是删除了第一个'_'而不是全部,所以使用memmove变得很简单。只需包含string.h并获取string的长度,然后调用memmovestring中的第二个字符复制回第一个字符,例如

...
#include <string.h>

void rm_1st_underscore (char *string)
{
    size_t len = strlen (string);
    memmove (string, string + 1, len);
}
...

(输出相同)