sscanf_s没有存储正确的模式

问题描述 投票:-1回答:1

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

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

c scanf
1个回答
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);
}
...

(输出相同)

© www.soinside.com 2019 - 2024. All rights reserved.