在C ++中输出字符串和strncpy时遇到问题

时间:2015-09-07 14:31:30

标签: c++ c-strings

我遇到了以下代码的问题,因为我似乎无法输出strncpy只输出我通过程序的命令行参数的前3个字符。另外我无法将修剪后的字符串打印到 ostream我将它们传递给我重载的运算符。 main和所有模块的代码粘贴在下面:

#include "Cstring.h"
#include <cstring>
#include <iostream>
using namespace w1;
int w1::characters = 3;
Cstring::Cstring(char* orginal) {
    if (orginal == nullptr)
        trimmed = nullptr;

        //strcpy(orginal,trimmed);
        cout << orginal << trimmed;
        strcpy(orginal,trimmed);
}
ostream& Cstring::display(ostream& output) {
        output << trimmed;
        return output;
}
ostream& w1::operator<<(ostream& console,Cstring& input) {
    static int arguments = 0;
    arguments++;
    return console << arguments << input.display(console) << "\n";
}


#ifndef CSTRING_H
#define CSTRING_H
#include <ostream>
using namespace std;
namespace w1 {
    extern int characters;
    class Cstring {
            const int max = 3;
            char *trimmed;
            public:
                Cstring(char* orignal);
                ostream& display(ostream& output);
    };
    ostream& operator<<(ostream& console,Cstring& input);

}
#endif


#include "Cstring.h"
using namespace std;
using namespace w1;
void process(char* user_data);



     #include "Cstring.h"
    #include <iostream>
    using namespace std;
    using namespace w1;
    void process(char* user_data) {
        Cstring trimmed(user_data);
        cout << trimmed
    }

    #include "process.h"
    #include "Cstring.h"
    #include <iostream>
    #include <cstring>
    using namespace std;
    using namespace w1;
    int main(int argc, char* argv[]) {
        if (argc == 1 )
            cout << argv[0] << " Insuffienct number of arguments(min 1)" << endl;
        cout << "Maximum number of characters stored " << w1::characters << endl;
            for (int x = 1 ; x < argc; x++ ) {
                process(argv[x]);


       }
}

2 个答案:

答案 0 :(得分:0)

你的程序有点混乱。您似乎想要做的就是输出每个命令行参数的前3个字符,并且您想知道如何使用strncpy,所以这里有一个最小的示例来显示:

#include <cstring>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; ++i)
    {
        char buffer[4] = { 0 };
        strncpy(buffer, argv[i], 3);
        cout << buffer << endl;
    }
}

这使用strncpy将每个命令行参数的前3个字符复制到缓冲区(大小为4,因为还需要一个空终止符),然后打印缓冲区的内容。仅复制3个第一个字符。你必须自己处理null终结符。

答案 1 :(得分:0)

1)您永远不会初始化Cstring::trimmed,除非您nullptr original nullptr时将其分配给nullptr。当您尝试从行trimmed上的strcpy(orginal,trimmed);或单位Cstring::trimmed进行复制时,您将获得未定义的行为。

2)您可能没有打算从original复制到argv[x] original,但是要从Cstring::trimmed复制到Cstring::trimmed而是。但在这种情况下,您仍然有未定义的行为,因为您尚未分配任何内存或已初始化w1::characters(参见1)。

3)您将Cstring::maxw1::characters定义为3但您从不使用其中任何一种(除非您在main中输出In web.xml <listener> <listener-class>com.project.session.ProjectSessionListener</listener-class> </listener> )。我假设您打算使用其中一个将输出限制为3个字符。