sscanf_s не хранит правильный шаблон - PullRequest
0 голосов
/ 03 ноября 2019

Я просто хочу строку без подчеркивания. Я попробовал ниже несколько кодов, все не работают:

строка является указателем на символ другой функции, она выглядит так: "" _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

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

вывод: _I_have_1_dog.dat

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

вывод: _I_have_1_dog.dat

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

вывод: _I_have_1_dog.dat

1 Ответ

0 голосов
/ 03 ноября 2019

Редактирование на основе удаления 1-го символа '_' вместо всех '_'

Самый простой подход к удалению начального '_' - просто сдвинуть все символы вниз на 1 вstring, если первый символ - '_'.

Вы можете использовать такие функции, как 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, а затем вызовите memmove, копируя со второго символа в string обратно на первый, например,

...
#include <string.h>

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

(вывод такой же)

...