是否有正确的方法可以在某个点之后复制字符串的一部分。
Party City 1422 Evergreen Street
我使用strpbrk()来复制名称,我总是可以通过空格对它进行标记,但是有一个字符串进程或技术,我可以复制出一个字符串的特定部分,从一开始就像复制一样[ 1422 Evergreen Street]或删除字符串的第一部分?
答案 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 */
}
根据需要进行修改和错误检查。