我只想要不带下划线的字符串。我尝试了以下几个代码,但都无法正常工作:
string是另一个函数的char指针,它看起来像这样:“” _I_have_1_dog.dat)“”
void func1(char *string)
{
char buffer[256]="";
unsigned long count = 0;
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
答案 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
的长度,然后调用memmove
从string
中的第二个字符复制回第一个字符,例如
...
#include <string.h>
void rm_1st_underscore (char *string)
{
size_t len = strlen (string);
memmove (string, string + 1, len);
}
...
(输出相同)