2015-09-07 130 views
-3

我遇到了下面的代碼問題,因爲我似乎無法得到strncpy只輸出命令行參數的前3個字符我已經通過我的程序。另外,我無法將修剪過的字符串打印到 ostream,我將它們傳遞給我的重載操作符。 主和所有模塊的代碼粘貼下面:在使用C++輸出字符串和strncpy時遇到問題

#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]); 


     } 
} 
+0

可能值得看格式。此外,你似乎已經重複了一些代碼。 –

+1

在'strcpy'目標是第一個參數。另外,我沒有看到爲「裁剪」分配空間的位置。 (例如:'trimmed = new char [(strlen(original)+ 1]') –

+0

您沒有在代碼中使用'strncpy'。您使用過'strcpy'。問題或代碼中是否有錯字? – user2079303

回答

0

你PROGRAMM是有點亂。所有你似乎想要做的是輸出的每個命令行參數的前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個第一個字符被複制。你必須自己照顧無效終結者。

+0

trimmed = new char [ (strlen的(原單))+ 1]; \t \t strncpy()函數(修剪,原單,3); –

+0

這是我在兩行加現在我得到:oop10x6020c8 btp20x6020c8 –

+0

下面是分配的鏈接解釋什麼,我需要要做,https://scs.senecac.on.ca/~oop345/pages/workshops/w1.html –

0

1)你從來沒有初始化,當你把它分配給nullptr如果originalnullptr除了Cstring::trimmed。當您嘗試從nullptr或單元化的trimmed複製它strcpy(orginal,trimmed);行時,您會收到未定義的行爲。

2)你可能不打算從Cstring::trimmed複製到original這是argv[x],而是意味着從複製到original代替Cstring::trimmed。但是在那種情況下,你仍然有未定義的行爲,因爲你沒有分配任何內存或初始化Cstring::trimmed(見1)。 3)您將w1::charactersCstring::max定義爲3,但您從不使用其中任何一種(除非在main中輸出w1::characters)。我會假設你打算使用其中的一個來限制輸出爲3個字符。

+0

修復基於您的意見,以及我忘了分配字符串時感到愚蠢。然而,運營商<<不工作,但內部顯示器工作 –