我制作了一个应该从两端修剪字符串的程序,如下例所示:
对于12345,我应该:1, 12, 123, 1234, 12345; 2, 23, 234, 2345; 3, 34, 345; 4, 45; 5
#include <iostream>
#include <string.h>
using namespace std;
char text[30]="123456", text2[30], text3[30];
int main()
{
for(int i=0; i<strlen(text); i++)
{
strcpy(text2, text+i);
for(int j=1; j<=strlen(text)-i; j++)
{
strncpy(text3, text2, j);
cout<<text3<<endl;
}
}
return 0;
}
消除第一个字符的部分有效,但是当我使用strncpy从字符串的末尾消除时,我得到的结果与我想要修剪的字符串的长度相同;例如,我得到的是55555而不是5.我尝试在text3
之前使用text3[0]='\0'
初始化strncpy
,但我仍然得到相同的结果,我不明白为什么。我确实在strncpy之前放了cout<<j
来查看它复制了多少个字符,并且数字完全匹配剩余字符串的长度。
答案 0 :(得分:0)
使用text
初始化"1234"
时考虑输出:
1
12
123
1234
2234
2334
2344
3344
3444
4444
strncpy
正在复制到text3缓冲区,但已经存在的内容仍然存在,因为它不会终止。如果忽略其余字符,则可以看到在开头复制了所需的输出。
1
12个
123个
1234
2 234
23 34
234 4
3 344
34 44
4 444
因此,您需要对复制的部分进行null终止。在strncpy
之后,您可以text3[j] = 0;
。
答案 1 :(得分:0)
为什么你不使用字符串?
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str = "12345";
int b, e;
for(int b = 0; b < str.length(); b++)
for(int e = b + 1; e < str.length() - b; e++)
cout << str.substr(b, e) << endl;
return 0;
}