我需要从C中的字符串中删除一组字符。
说str = "01 "
,然后:
"112345"
输出应为"2345"
"0 78abc"
输出应为"78abc"
" 7777"
输出应为"7777"
我希望你能借助这些例子来理解。
功能格式为:
char* StripLeadingChars(char* str, char* originalString)
编辑: 我很抱歉没有详细说明代码。我试过编码,下面是我的代码。
char* StripLeadingChars(char* str, char* originalString)
{
for(int i=0;i<strlen(str);i++)
{
for(int j=0,k=0;j<=strlen(originalString);j++)
{
if(originalString[j]!=str[i])
originalString[k++] = originalString[j];
}
}
return originalString;
}
但是这段代码会删除originalString中str的所有字符,如下所示。
str = "01 "
originalString="11230 45"
输出为"2345"
,而所需输出为"230 45"
请帮我纠正我的代码。谢谢!
答案 0 :(得分:0)
也许尝试完成此代码:
char *stripLeadingChars(char* str, char* originalString) {
while(originalString is not ended && first char of originalString belongs to str) {
advance originalString;
}
return the string pointed by originalString;
}
对于测试“属于...”,如果该字符没有出现在strchr(str, first character of originalString)
中,我建议使用NULL
返回str
(即假)。
答案 1 :(得分:0)
你不应该在循环中使用strlen() - here's why。
你已经尝试了一些东西 - 没关系。这是一个可能的解决方案:
#include <string.h>
char* StripLeadingChars(char* str, char* orig) {
while (strchr(str, *orig) != NULL) {
++orig;
}
return orig;
}
工作原理:它检查orig
开头的字符是否在str
字符串文字中。如果是这样,它将转到orig
的下一个字符。如果没有,它将停止检查并返回orig
指针。
答案 2 :(得分:0)
挑战在于处理所有案例,包括测试用例,不匹配案例和所有匹配案例。以下是满足所有条件的尝试。 (如果所有字符都与strip
个字符匹配,则返回NULL)注释以内联方式提供:
#include <stdio.h>
char *StripLeadingChars (char *strip, char *string)
{
int prefix = 0; /* simple flag to test if in leading part of string */
char *p = string;
char *s = strip;
if (!p) {
fprintf (stderr, "%s() error: invalid string.\n", __func__);
return NULL;
}
while (*p) /* for every character in string */
{
while (*s) /* test each character in strip */
{
while (*p == *s || *p == ' ') { /* string char matches strip or space */
p++; /* increment sting pointer */
prefix = 1; /* flag char matched */
}
s++; /* increment strip pointer */
}
if (!prefix) /* break on first non-match of strip */
break;
prefix = 0; /* reset toggle */
}
return (*p) ? p : NULL; /* if p valid, return p, else NULL */
}
int main (int argc, char *argv[]) {
if (argc < 3 ) {
fprintf (stderr, "Error: insufficient input, usage: %s <strip> <string>\n", argv[0]);
return 1;
}
printf ("\nInput:\n\n string : %s\n\n strip : %s\n\n", argv[2], argv[1]);
printf ("\nstripped : %s\n\n", StripLeadingChars (argv[1], argv[2]));
return 0;
}
<强>建立/运行:强>
gcc -Wall -Wextra -o bin/stripld stripleading.c
./bin/stripld 01 112345
Input:
string : 112345
strip : 01
stripped : 2345
./bin/stripld 01 "0 78abc"
Input:
string : 0 78abc
strip : 01
stripped : 78abc
./bin/stripld 01 " 7777"
Input:
string : 7777
strip : 01
stripped : 7777
./bin/stripld 01 "23 456"
Input:
string : 23 456
strip : 01
stripped : 23 456
./bin/stripld 01 "00 11"
Input:
string : 00 11
strip : 01
stripped : (null)
答案 3 :(得分:-1)
函数char * strcpy ( char * destination, const char * source );
可用于实现此目的。
要切断前两位数,请将其用作strcpy (&destination, &source[2]);
这将复制到目标字符串,源字符串从索引为[2]的索引提供的任何字符开始。见例子
int main(void) {
char str1[]= "012345";
char str3[10];
strcpy ( str3, &str1[2] );
puts (str1);
puts (str3);
return 0;
}
输出是:
012345
2345
来源:http://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htm