2010-02-09 172 views
2

我是C++編程語言的初學者。我想編寫一個程序,將字符串放在一個名爲str的字符串數組中,並將其複製到名爲str_alpha的新數組中。將char轉換爲char無效* - 將字符串數組中的char複製到另一個字符串數組

同樣的數字,程序將其從str數組複製到str_digit數組。

有我的卑微的代碼,它可能充滿了錯誤和東西。但是,這是我現在可以用我的一點經驗做的事情。

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <cctype> 

using namespace std; 

char str[100], str_alpha[100], str_digit[100]; 

int main() 
{ 
    gets(str); 

    for (int i=0 ; str[i] ; i++) 
    { 
     if (isalpha(str[i])) 
     { 
      strcpy (str_alpha[i] , str[i]); 
     } 
     else if (isdigit(str[i])) 
     { 
      strcpy (str_digit[i] , str[i]); 
     } 
    } 

    cout << "Alpha is " << str_alpha << endl ; 
    cout << "Number is : " << str_digit << endl ; 

    return 0; 
} 

,它給我的那些錯誤:

F:\C++Progs\string\main.cpp||In function `int main()':| 
F:\C++Progs\string\main.cpp|18|error: invalid conversion from `char' to `char*'| 
F:\C++Progs\string\main.cpp|18|error: initializing argument 1 of `char* strcpy(char*,  const char*)'| 
F:\C++Progs\string\main.cpp|18|error: invalid conversion from `char' to `const char*'| 
F:\C++Progs\string\main.cpp|18|error: initializing argument 2 of `char* strcpy(char*, const char*)'| 
F:\C++Progs\string\main.cpp|22|error: invalid conversion from `char' to `char*'| 
F:\C++Progs\string\main.cpp|22|error: initializing argument 1 of `char* strcpy(char*, const char*)'| 
F:\C++Progs\string\main.cpp|22|error: invalid conversion from `char' to `const char*'| 
F:\C++Progs\string\main.cpp|22|error: initializing argument 2 of `char* strcpy(char*, const char*)'| 
||=== Build finished: 8 errors, 0 warnings ===| 

請幫助我。 在此先感謝。

回答

4

首先,strcpy拷貝C字符串(字符數組)不是char s。此外,即使不是這種情況,行strcpy(str_digit[i],str[i])strcpy(str_alpha[i], str[i])仍然可能是錯誤的。由於您尚未初始化數組str_digit和str_alpha,因此如果其中任何一個垃圾值恰好爲0x00,則打印時將得到大量垃圾值,cout語句將無法打印整個字符串。如前所述,您確實應該使用std::string而不是char[]char*。話雖如此,這裏是char[]std::string的代碼修正版本。

使用gets是不好的做法,您可以考慮使用std::cin來代替。你可能想使用迭代器而不是簡單的for循環。

//using char[] 
#include <iostream> 

using namespace std; 

int main() 
{ 
    char str[100] , str_alpha[100] , str_digit[100] ; 
    int alpha_counter=0, digit_counter=0; 

    cin.get(str, 99); 

    for (int i=0 ; str[i] ; i++) 
    { 
     if(isalpha(str[i])) 
     { 
      str_alpha[alpha_counter] = str[i]; 
      alpha_counter++; 
     } 
     else if (isdigit(str[i])) 
     { 
      str_digit[digit_counter] = str[i]; 
      digit_counter++; 
     } 
    } 
    str_alpha[alpha_counter] = 0; 
    str_digit[digit_counter] = 0; 

    cout << "Alpha is " << str_alpha << endl ; 
    cout << "Number is : " << str_digit << endl ; 

    return 0; 
} 

而且使用std::string版本:

//using std::string 
#include <iostream> 

using namespace std; 

int main() 
{ 
    string str, str_alpha , str_digit; 

    cin >> str ; 

    for (string::iterator it = str.begin();it<str.end();it++) 
    { 
     if(isalpha(*it)) 
     { 
      str_alpha += *it; 
     } 
     else if (isdigit(*it)) 
     { 
      str_digit += *it; 
     } 
    } 

    cout << "Alpha is " << str_alpha << endl ; 
    cout << "Number is : " << str_digit << endl ; 

    return 0; 
} 

兩個版本編譯而不-Wall-pedantic在G ++ 4.2.1警告。

4

我是C++編程語言的初學者。

不要使用char*等;使用C++預定義的類型對於這一點,你的情況string

string str; 
cin >> str; 

string alpha; 
string digit; 

for (unsigned int i = 0; i < str.length(); ++i) { 
    char chr = str[i]; 
    if (isalpha(chr)) 
     alpha.push_back(chr); 
    else if (isdigit(chr)) 
     digit.push_back(chr); 
} 

此外,strcpy,正如它的名字說,用於複製字符串,而不是單個char秒。您可以通過分配直接複製這些內容。無需功能調用。

0

strcpy複製整個字符串。使用普通分配(=運算符)複製字符。

0

即使strcpy被設計爲通過字符串(字符數組)複製,您正在複製字符。編譯器因此抱怨,因爲你提供'char'而不是'char *'。如果複製在隨後的字符只是做:

str_alpha[i] = str[i]; 
2

的問題是,strcpy旨在複製整個字符串。在這種情況下,您正在複製單個字符,而不是整個字符串。對於單個字符,您可以使用簡單的分配。

但還有其他一些事情要處理。首先,你有:

char str [100];

以外的任何功能。它定義了一個由100個字符組成的數組,並將它們全部初始化爲0.然後循環,試圖找到被分類爲字母或數字的字符 - 永遠不會發生,因爲零字節('\ 0',不'0')從來沒有一個。

事實上,據我所知,根本不需要str。你(顯然)想要什麼大致是這樣:

for (i in 0 to 127) 
    if (alpha(i)) 
     add i to str_alpha 
    else if (digit(i)) 
     add i to str_digit 

正如康拉德·魯道夫已經指出的那樣,你可能會好得多使str_digit和str_alpha到的std :: string的不是char的數組。數組可以完成這項工作,但他們會做更多的工作來獲得真正的正確。