字符串操作

时间:2011-05-09 22:07:27

标签: c string

是否有正确的方法可以在某个点之后复制字符串的一部分。

Party City 1422 Evergreen Street

我使用strpbrk()来复制名称,我总是可以通过空格对它进行标记,但是有一个字符串进程或技术,我可以复制出一个字符串的特定部分,从一开始就像复制一样[ 1422 Evergreen Street]或删除字符串的第一部分?

6 个答案:

答案 0 :(得分:6)

如果要通过起始位置和长度来指定它,可以始终使用strncpy和一些指针算法。

编辑:当您知道起始字符串时,您可以使用

char *pos = strstr(src, "1422");
strcpy(dst, pos);

答案 1 :(得分:2)

如果您知道要选择的子字符串的第一个和最后一个字符的索引,则应使用strncpy执行此操作。请参阅以下代码段,以从给定startIndex的inputStr字符串中复制substringLength字符。

char * inputStr;
char * outputStr;

strncpy(outputStr, inputStr + startIndex, substringLength);

答案 2 :(得分:1)

如果要在特定字符串的位置拆分,可以执行以下操作:

#define MAX_STRING 1024
int main() {
    char myleftBuffer[MAX_STRING]="";
    char myrightBuffer[MAX_STRING]="";
    char mystring[]="Party City 1422 Evergreen Street";
    char *start = strstr(mystring, "1422");
    if(start) {
        strcpy(myrightBuffer, start);
        strncpy(myleftBuffer, mystring, (start - mystring));
    }
    printf("%s -> %s\n", myleftBuffer, myrightBuffer);
    return;
}

哪个输出:

Party City  -> 1422 Evergreen Street

答案 3 :(得分:1)

实际上,strncpy 不是对于手头的任务来说是一个特别好的选择。它总是填补你的价值以占据整个目的地,这通常是非常浪费的(它最初设计用于将文件名放入Unix文件系统;它对此有好处,但不是很多)。

我想我会使用sscanf。假设我们总是希望从第一个数字复制到字符串的末尾,你可以这样做:

char street_name[256];

sscanf(input_buffer, "%*[^0-9]%255[^\n]", street_name);

FWIW,%*[^0-9]部分跳过字符,直到达到0-9范围内的某些内容(是的,我知道它看起来像正则表达式,但scanf和公司也支持它)。其中*表示扫描,但指定找到的内容。 %255[^\n]表示读取和分配,直到输入中的下一个换行符,或最多255个字符,以先到者为准。

答案 4 :(得分:0)

int split_at(const char *in, const char *match, char *buf, size_t len)
{
     char *pos;

    if( (pos = strstr(in, match)) == NULL )
        return -1; // No match
    else if( pos == in )
        return  0; // match is empty

    if( strlcpy(buf, pos, len) >= len )
        fprintf(stderr, "WARNING: match truncated: %s", buf);

    return 1;
}

答案 5 :(得分:0)

在一般情况下可能不可能,并且你最好在单独的字段中获取输入,但如果那不是一个选项,则以下内容应该有效:

size_t street_extract(char* ret,size_t retsz,char* addr)
    {
    size_t i,nwrote;
    for(i=0; addr[i] ;i++)
        {
        if(addr[i]!=' ') continue; /* only check at start of word */
        i++;
        if('0' < addr[i] && addr[i] < '9') break; /* found street number */
        }
    if(!addr[i]) return -1; /* not found */

    for(nwrote=0; addr[i+nwrote] && nwrote < retsz-1 ;nwrote++)
        {
        ret[nwrote] = addr[i+nwrote];
        }

    ret[nwrote] = 0;
    while(addr[i+nwrote]) nwrote++;
    return nwrote; /* result is nwrote characters in length */
    }

根据需要进行修改和错误检查。