C++ 字符串 剪切

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 字符串 剪切相关的知识,希望对你有一定的参考价值。

强调 用指针的方法,例字符串“jiangnanlanhe”,从m位置开始剪切n个字符,然后输出剪切的字符串,如果剪切的长度大于m位置以后的字符串长度,那么有多少输出多少。用指针,且要函数调用。简单点

代码如下,仅供参考:
#include<iostream>
#include<string>
using namespace std;
char fun(char str[],int m,int n)

int i,k;
char *p;
p=str;
k=strlen(str);
if(n>k-m+1)
n=k-m+1;
for(i=0;i<n;i++)
cout<<*(p+m+i-1);
cout<<endl;
return '\0';

int main()

int m,n;
char str[100];
cout<<"请输入字符串:"<<endl;
cin.get (str,100);
cout<<"请输入要剪切的起始位置和长度:"<<endl;
cin>>m>>n;
cout<<"剪切字符为:"<<endl;
fun(str,m,n);
return 0;

有不清楚的再联系我。
参考技术A #include<iostream>
#include<string>
using namespace std;

string substr(string *,int,int);

int main()

string str="jiangnanlanhe",*sp;
int len,loca;
sp=&str;
cout<<"输入起始位置与截取长度"<<endl;
cin>>loca>>len;
cout<<substr(sp,loca,len);

return 0;


string substr(string *sp,int loca,int len)

string sub;
int length;
if(len<(*sp).length()-loca+1)
length=len;
else length=(*sp).length()-loca+1;
for(int i=0;i<length;i++)
sub+=(*sp)[loca+i-1];
return sub;
参考技术B #include<iostream>
#include<string>
using namespace std;

char * SubString(int m,int n,char *S,char *D)

int len = strlen(S);
int i=0;
for(i=m; (m < len) && (i<m+n); i++)

*(D+i-m)= *(S+i);

*(D+i-m) = 0;
return D;


int main()

char *s = "jiangnanlanhe";
char d[100];
int m,n;
cout<<"Please Input: m,n"<<endl;
cin >>m>>n;
cout <<"out string :"<< SubString(m,n,s,d) << endl;
system("PAUSE");
参考技术C #include<iostream.h>
#include<string.h>
void strcut(char*str,int m,int n)

char string[50];
int j=0,i,len;
len=strlen(str);
for(i=m;i<(m+n)&&i<=len;++i)
string[j++]=str[i];
string[j]='\0';
cout<<string;

void main()

char s[50];
int m=0,n=0;
cout<<"输入字符串"<<endl;
cin>>s;
cout<<"输入m、n"<<endl;
cin>>m>>n;
strcut(s,m,n);

在第 n 次出现字符时剪切字符串

【中文标题】在第 n 次出现字符时剪切字符串【英文标题】:Cutting a string at nth occurrence of a character 【发布时间】:2011-07-26 13:35:32 【问题描述】:

我想要做的是获取一个字符串,例如"this.those.that",并从第 n 次出现的字符中获取子字符串。因此,从字符串的开头到第二次出现. 将返回"this.those"。同样,从. 的第二次出现到字符串末尾将返回"that"。抱歉,如果我的问题模糊不清,那么解释起来并不容易。另外,请不要建议额外的变量,结果将是一个字符串而不是一个数组。

【问题讨论】:

反对拆分成一个数组,然后将数组的切片重新组合在一起?它使用对字符串进行操作或生成字符串的函数。 看来你已经知道答案了;拆分分隔符上的字符串,然后用这些部分重新构建一个新字符串似乎是最好的选择。为什么要限制自己不使用数组? 我不够具体。除了字符串之外,我不想制作额外的数组。在字符串上使用数组函数适用于我想要实现的目标。我会解决这个问题。 @tvanfosson 为什么我的回答错了? @tvanfosson 我相信我们可能对 OP 的问题有不同的解释。 【参考方案1】:

您可以在没有数组的情况下执行此操作,但需要更多代码且可读性较差。

通常,您只想使用尽可能多的代码来完成工作,这也增加了可读性。如果您发现此任务正在成为性能问题(对其进行基准测试),然后您可以决定开始重构以提高性能。

var str = 'this.those.that',
    delimiter = '.',
    start = 1,
    tokens = str.split(delimiter).slice(start),
    result = tokens.join(delimiter); // those.that
    
console.log(result)

// To get the substring BEFORE the nth occurence
var tokens2 = str.split(delimiter).slice(0, start),
    result2 = tokens2.join(delimiter); // this

console.log(result2)

jsFiddle.

【讨论】:

我以为结果应该是“this.those”和“that”? @tvanfosson 也许我误解了这个问题,但它被接受了:) 我希望有办法只收藏这个答案! 要获取“this.those”和“that”,将 slice(start) 更改为 slice(0,start) 在 split 中使用可选的 limit 参数甚至更短:result = str.split(delimiter, start+1).join(delimiter)【参考方案2】:

我很困惑为什么你想纯粹用字符串函数来做事情,但我想你可以做如下的事情:

//str       - the string
//c         - the character or string to search for
//n         - which occurrence
//fromStart - if true, go from beginning to the occurrence; else go from the occurrence to the end of the string
var cut = function (str, c, n, fromStart) 
    var strCopy = str.slice(); //make a copy of the string
    var index;
    while (n > 1) 
        index = strCopy.indexOf(c)
        strCopy = strCopy.substring(0, index)
        n--;
    

    if (fromStart) 
        return str.substring(0, index);
     else 
        return str.substring(index+1, str.length);
    

但是,我强烈建议使用像 alex 的更简单的代码。

【讨论】:

【参考方案3】:

如果你真的想坚持使用字符串方法,那么:

// Return a substring of s upto but not including
// the nth occurence of c
function getNth(s, c, n) 
  var idx;
  var i = 0;
  var newS = '';
  do 
    idx = s.indexOf(c);
    newS += s.substring(0, idx);
    s = s.substring(idx+1);
   while (++i < n && (newS += c))
  return newS;

【讨论】:

【参考方案4】:

试试这个:

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.)3/, '');
"xcv.xcv.x"

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.)**nth**/, ''); - 其中 nth 是要删除的出现次数。

【讨论】:

这个比公认的答案好。有时分隔符可能是正则表达式(例如 \s+)。在这种情况下,接受的答案将不起作用。但是这个会。 @killua8p 奇怪的推理。如果有时分隔符可能是一个正则表达式,你会这样设计它。如果要在字符串上拆分,您不应该总是偏爱正则表达式,因为您可能需要它。雅尼。 这个速度快 4 倍左右。【参考方案5】:

以防万一有人需要“this”和“those.that”,就像 alex 在他的 comment 中描述的那样,这里是修改后的代码:

var str = 'this.those.that',
    delimiter = '.',
    start = 1,
    tokens = str.split(delimiter),
      result = [tokens.slice(0, start), tokens.slice(start)].map(function(item) 
    return item.join(delimiter);
  ); // [ 'this', 'those.that' ] 

document.body.innerHTML = result;

【讨论】:

以上是关于C++ 字符串 剪切的主要内容,如果未能解决你的问题,请参考以下文章

字符串、列表或其他东西的向量? C++

C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.

如何从 jquery 中的字符串中剪切第一个字符?

PHP 剪切HTML字符串

DataTables如何剪切字符串并添加(...)并将完整的字符串放在工具提示中

在第 n 次出现字符时剪切字符串