Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,如何将字符串的其余部分放在特定字符之后_C_Parsing - Fatal编程技术网

在C语言中,如何将字符串的其余部分放在特定字符之后

在C语言中,如何将字符串的其余部分放在特定字符之后,c,parsing,C,Parsing,我想得到第一个“/”符号后面的字符串的其余部分 我想要得到的期望是: index/homepage/component.html/sdfsdf int main(int argc, char *argv[]){ char link[] = "www.google.com/index/homepage/component.html/sdfsdf"; char *token; char *temp[1000]; int i=0; token =

我想得到第一个“/”符号后面的字符串的其余部分

我想要得到的期望是:

index/homepage/component.html/sdfsdf

int main(int argc, char *argv[]){
    char link[] = "www.google.com/index/homepage/component.html/sdfsdf";    

    char *token;
    char *temp[1000];

    int i=0;

    token = strtok(link, "/");
    while(token != NULL){

        temp[i] = token;
        token = strtok(NULL, "/");
        ++i;
    }



    printf("the parse string: %s\n",*temp);

    return 0;
}

the parse string: www.google.com


希望这有帮助。首先找出“/”字符在字符串中的位置,然后构建子字符串,在每个代码块上都提到了它的作用

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char link[] = "www.google.com/index/homepage/component.html/sdfsdf";    
    char linktemp[50];
    int i=0,c=0;


    ////Finding the Position of First '/'
    for(i=0;i<strlen(link);i++)
    {
        if(link[i]=='/')
        {
            break;
        }
    }

    //If no '/' Character found
    if(i==strlen(link))
    {
        printf("No '/' Character found in the String");
        return 0;
    }

    ////Creating the Substring
    while(c<strlen(link)-i)
    {
    linktemp[c]=link[i+c+1];
    c++;
    }
    linktemp[c] ='\0';

    printf("the parse string: %s\n",linktemp);

    return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{
char link[]=“www.google.com/index/homepage/component.html/sdfsdf”;
char-linktemp[50];
int i=0,c=0;
////查找第一个“/”的位置

对于(i=0;i由于在较长的字符串中有一个目标字符,要查找第一个匹配项,只需使用
strchr
返回指向较大字符串中所需字符的指针。在这种情况下,第一个
'/'
。使用
strchr
查找与第一个
'/'相关联的指针。
您的电话可能是:

char *p = strchr (link, '/');
如果
p
不是
NULL
,则在字符串中找到它。回想一下,找到的字符是不需要的分隔符,因此将指针向前移动1,使其指向
“/”后面的第一个字符

此时,只需调用
strlen()
即可告诉您必须从保存结果的
link
字符串复制多少字符。然后使用长度,您只需调用
memcpy
即可从
link
从指针位置开始复制到字符串末尾(包括nul终止字符)以获取所需字符。一个简短的示例是:

#include <stdio.h>
#include <string.h>

#define MAXTOK 2048

int main (void) {

    char link[] = "www.google.com/index/homepage/component.html/sdfsdf",
        *p = link,
        token[MAXTOK];              /* declare array to hold results */

    if ((p = strchr (link, '/'))) { /* check whether '/' found in line */
        size_t len = strlen (++p);  /* advance pointer by 1, get length */
        if (len > MAXTOK - 1) {     /* check if length exceeds available */
            fputs ("error: string exceeds allowable length.\n", stderr);
            return 1;
        } 
        memcpy (token, p, len + 1); /* copy remaining part of string */
        printf ("%s\n", token);     /* output it */
    }
}

提供所需的结果字符串。请仔细查看,如果有问题,请告诉我。

其他答案涵盖了一种更受欢迎的方法,即
strchr()
,但对于完整性,这是使用和sscanf实现的方法

其工作原理是获取“/”之前的所有内容,并使用%*[^/]忽略它(*表示它不会将其放入变量中),然后在“/”的另一端获取所有内容,直到行末字符被%[^\n]命中为止

#include <stdio.h>

char link[] = "www.google.com/index/homepage/component.html/sdfsdf";   

int main(int argc, char **argv){
    char buff[128];

    // Seporate string after first "/"
    // %*[^/] goes untill it finds '/' and stops, but wont put it in a var
    // "/" will eat the '/' charater
    // %[^\n] goes untill it finds the '\n' char and puts it into buff
    sscanf(link, "%*[^/]/%[^\n]", buff);

    printf("%s\n", buff);
}
#包括
char link[]=“www.google.com/index/homepage/component.html/sdfsdf”;
int main(int argc,字符**argv){
字符buff[128];
//第一个“/”后的深褐色字符串
//%*[^/]直到找到“/”并停止,但不会将其放入变量中
//“/”将吃掉“/”字符
//%[^\n]直到找到“\n”字符并将其放入buff
sscanf(链接“%*[^/]/%[^\n]”,buff);
printf(“%s\n”,浅黄色);
}

编辑:添加了对“*”的澄清。

我认为您需要多读一点。可能还需要多读一点关于和指针以及字符串的内容。可能使用
strchr()
。可能不使用
strtok()
。请注意,只回答代码而不做任何解释是不好的,因此这种回答是不鼓励的。请花些时间阅读。@Someprogrammerdude谢谢你的建议,我已经解释了这在代码中是如何工作的,顺便提一下,现在我已经添加了解释。你使用
 sscanf
是正确的——但是
sscanf
不使用正则表达式匹配。相反,整个
Xscanf
函数族使用预先确定的转换说明符来处理字符提取。
[…]
只是另一个用于匹配非空字符序列的转换说明符,还允许对匹配进行求反。sscanf(recvline,“%[^/]”,buff);此行将获得:www.google.com--%*[^/]直到它找到“/”并停止。这里的*是做什么的。很抱歉,我对reagexMiracle的记忆生锈了,*这意味着它所读取的内容不会被放入变量中。希望对这一个有帮助的SSO,strchr将一直运行到“/”找到,然后我们将指针前进到“/”由1。然后从那里将字符串的其余部分复制到标记中。这里我们将指针或内存地址复制到数组中,该数组指向字符串的剩余字符。我是否正确理解了它?因为
p
是指向
'/'
之后的字符的指针,所以您可以将其视为指向字符串的任何指针(在本例中,它只是“字符串的其余部分”)。因此,当您使用
memcpy(token,p,len+1)
时,您正在将
len+1
字节从
p
复制到
token
(您添加
+1
以确保复制nul终止字符)。无需在此处使用strcpy,因为您已经在
len
中计算了字符串其余部分的长度。调用
strcpy
只需在复制之前再次扫描字符串的结尾,此处无需此操作。
:)
#include <stdio.h>

char link[] = "www.google.com/index/homepage/component.html/sdfsdf";   

int main(int argc, char **argv){
    char buff[128];

    // Seporate string after first "/"
    // %*[^/] goes untill it finds '/' and stops, but wont put it in a var
    // "/" will eat the '/' charater
    // %[^\n] goes untill it finds the '\n' char and puts it into buff
    sscanf(link, "%*[^/]/%[^\n]", buff);

    printf("%s\n", buff);
}