无效的转换字符到char * - 将字符串数组中的char复制到另一个字符串数组

时间:2010-02-09 20:11:50

标签: c++

我是C ++编程语言的初学者。我想编写一个程序,将字母表中的字母表称为str,并将其复制到名为str_alpha的新数组中。

同样的数字,程序将它从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 ===|

请帮帮我。 提前谢谢。

5 个答案:

答案 0 :(得分: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。您可以通过分配它们来直接复制它们。无需调用函数。

答案 1 :(得分:4)

首先,strcpy复制C字符串(字符数组)而非char s。此外,即使不是这种情况,行strcpy(str_digit[i],str[i])strcpy(str_alpha[i], str[i])仍然可能是错误的。由于你还没有初始化数组str_digit和str_alpha,如果这些垃圾值中的任何一个恰好是0x00,那么你会在打印时得到很多垃圾值,{{ 1}}语句将无法打印整个字符串。如前所述,您确实应该使用cout而不是std::stringchar[]。话虽如此,这里是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的g ++ 4.2.1上编译时没有出现警告。

答案 2 :(得分: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

正如Konrad Rudolph已经指出的那样,将str_digit和str_alpha制作成std :: string比使用char数组要好得多。数组可以完成这项工作,但是他们会做更多工作才能真正做到正确。

答案 3 :(得分:0)

strcpy复制整个字符串。使用普通赋值(=运算符)复制字符。

答案 4 :(得分:0)

您正在复制字符,即使strcpy旨在复制字符串(字符数组)。因此编译器抱怨是因为你提供'char'而不是'char *'。如果您要复制字符,请执行以下操作:

str_alpha[i] = str[i];