strncpy没有正确修剪 - 长度相同

时间:2016-05-29 12:28:10

标签: c++

我制作了一个应该从两端修剪字符串的程序,如下例所示:

对于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来查看它复制了多少个字符,并且数字完全匹配剩余字符串的长度。

2 个答案:

答案 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;

Observe this in action

答案 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;
}