strncpy 无法正确修剪 - 相同的长度

strncpy doesn't trim properly - same length

本文关键字:修剪 strncpy      更新时间:2023-10-16

我做了一个程序,应该从两端修剪一个字符串,就像这个例子一样:


对于 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。在strncpy之前,我尝试用text3[0]=''初始化text3,但我不断得到相同的结果,我不知道为什么。我确实在strncpy之前放了cout<<j,以查看它复制了多少个字符,并且数字与剩余字符串的长度完全匹配。

当我们使用 "1234" 初始化 text 时考虑输出:

1
12
123
1234
2234
2334
2344
3344
3444
4444

strncpy正在复制到 text3 缓冲区中,但已经存在的内容仍然存在,因为它不会以 null 终止。如果忽略其余字符,则可以看到所需的输出在开头被复制。


112
123
1234
年2234
2334
2344
3344
3444
4444

因此,您需要以空值终止复制的部分。strncpy之后,你可以做text3[j] = 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;
}