I am learning c++, and I am having issues doing some newbie things. I am trying to create a very small application that takes the users input and stores it into a char array. I then parse through that array and remove all parenthesis and dases and display it. like the following
(325)858-7455
to
3258587455
But I am getting errors
error C2440: '=' : cannot convert from 'const char [2]' to 'char'
Below is my simple code that can easily be thrown in a compiler and ran.
#include "stdafx.h"
#include<iostream>
#include<conio.h>
using namespace std;
/*
This is a template Project
*/
int main()
{
char phoneNum[25];
for(int i = 0; i < (sizeof(phoneNum) / sizeof(char)); i++)
{
phoneNum[i] = "i";
}
cout<< "Enter a phone Number" <<endl;
cin>>phoneNum;
if(phoneNum[0] != '(' || phoneNum[4] != ')' || phoneNum[8] != '-')
{
cout<<"error";
}
else
{
for(int i = 0; i < (sizeof(phoneNum) / sizeof(char));i++)
{
if(phoneNum[i] != '(' || phoneNum[i] != ')' || phoneNum[i] != '-')
{
cout<<phoneNum[i];
}
}
}
cin>>phoneNum;
getchar();
return 0;
}
It is not completely finished so if anyone has any pointers on the best way to remove strings characters from a string. that would be great.
The problem is here, I believe:
phoneNum[i] = "i";
You want to assign a single character, so you need to use single quotes for your literal:
phoneNum[i] = 'i';
There may well be other problems - I've only tried to fix the one mentioned in the title :)
The important thing here is to understand the difference between "i"
and 'i'
.
"i"
is a string, and strings are stored in memory as a sequence of char values, appending at the end of the string a null character (let's say zero). So when you write "hello"
you are storing 'h' 'e' 'l' 'l' 'o' '(null)'
. In the same way, when you write "i"
, you are storing 'i' '(null)'
, and thats the 'const char [2]'
(an array of 2 char elements).
When you take a 'char array' and use the [] operator, you are referring to a 'char'
element in that array. So when you write phoneNum[i]
you are getting a 'char'
.
That's why you need to write phoneNum[i] = 'i';
I suggest using C++ strings and streams:
#include <string>
#include <iostream>
#include <cstdlib>
using std::string;
using std::cout;
using std::endl;
using std::cerr;
using std::cin;
using std::flush;
int main(void)
{
string phone_number;
cout << "Enter phone number: " << flush;
getline(cin, phone_number);
// Check first for valid characters
const string valid_characters = "0123456789()- ";
string::size_type position = phone_number.find_first_not_of(valid_characters);
if (position != string::npos)
{
cerr << "Invalid phone number.\n";
return EXIT_FAILURE;
}
// Remove non-numeric characters
const string chars_to_remove = " ()-";
position = 0;
while ((position = phone_number.find_first_of(chars_to_remove, position))
!= string::npos)
{
phone_number.erase(position, 1);
}
cout << "\nPhone number only digits: " << phone_number << endl;
return EXIT_SUCCESS;
}
The std::string
has many useful methods for manipulating methods.
The advice from many experienced developers on Stack Overflow is for newbies to learn using C++ strings (std::string
) before using C-style strings (char *
).
phoneNum[i] = "i";
The thing on the left is a char
; the thing on the right is a string, an array of char
. You want 'i'
on the right.
Why do you need this check? What if they wanted to enter a non-US phone number formatted like you offered [meaning with parens and dashes, but not limited to (3)3-4]
if(phoneNum[0] != '(' || phoneNum[4] != ')' || phoneNum[8] != '-')
{
cout<<"error";
}
else
I would remove that block.