2010-02-09 209 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的数组。数组可以完成这项工作,但他们会做更多的工作来获得真正的正确。