gpt4 book ai didi

c - sscanf_s 未存储正确的模式

转载 作者:行者123 更新时间:2023-11-30 19:25:31 26 4
gpt4 key购买 nike

我只想要不带下划线的字符串。我尝试了下面的一些代码都不起作用:

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

  • 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

    最佳答案

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

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

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

    使用循环方法的简单函数可以是:

    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);
    }
    ...

    (输出相同)

    关于c - sscanf_s 未存储正确的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678071/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com