我是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 ===|
请帮帮我。 提前谢谢。
答案 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::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
的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];