Archives
D Programming
DD.gnu digitalmars.D digitalmars.D.bugs digitalmars.D.dtl digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript |
c++ - string functions
Hi all, I'm new to this group so would like to introduce myself. Still grappling with C++. Trying out every possible string asscotiated commands at the moment but I've come to a problem. How can I extract a decimal or hex value from a string containing letters? The only fucntions I can find are ones like stoi which only work with string numbers and ignore letters. Please help! Peter. Dec 01 2002
Hi Peter Try strtol(). It's the standard one - http://www.mkssoftware.com/docs/man3/strtol.3.asp some simple examples #include <stdlib.h> int main(int, char **) { int i1 = strtol("16", NULL, 0); // i == 16 (base 10 deduced) int i2 = strtol("16", NULL, 10); // i == 16 (base 10 stipulated) int i3 = strtol("16", NULL, 16); // i == 22 (base 16 stipulated) int i4 = strtol("011", NULL, 0); // i == 9 (base 8 deduced) int i5 = strtol("011", NULL, 10); // i == 11 (base 10 stipulated) - actually, this should be an error, since leading 0 means octal int i6 = strtol("011", NULL, 16); // i == 17 (base 8 stipulated) int i7 = strtol("0x11", NULL, 0); // i == 9 (base 16 deduced) int i8 = strtol("0x11", NULL, 10); // i == 0 (base 10 stipulated) - fails, since base leading 0x means octal int i9 = strtol("0x11", NULL, 16); // i == 17 (base 16 stipulated) return 0; } Hope that helps. If not, post more qs. Matthew "Peter Chaffe" <Peter_member pathlink.com> wrote in message news:asf3f4$1n44$1 digitaldaemon.com...Hi all, I'm new to this group so would like to introduce myself. Still grappling with C++. Trying out every possible string asscotiated Dec 02 2002
Hello Matthew, thanks for the reply, I've tried your code and it works fine for char(numbers) but char(letters) seem to be an invalid input, returns 0. As you may have gathered, I'm new to c++ so I keep experimenting. This is the type of output I'm after: Assume a char byte is saved. I am trying to get it's dec or hex value. ie: char hex dec "X" = 58 88 "x" = 78 120 "y" = 79 121 "z" = 7A 122 --------------------------------------------------- Actually I've just solved it! see below: char Letters. get loaded with "abcd" and the long int temp. accepts the values. The problem now is I don't know if the values are in hex or dec as the cout<< might be defaulting the output to dec. Ok, I've added an xor with 1234h if the val in temp is hex then according to my calculator the output should be either 13be-hex or 5054-dec depending on how << is affecting it. abcd == 18A == 394 dec. Output = 394 ? abcd xor 1234h = 1368 , don't add up! abcd xor 4660 ie. dec equiv. , now I'm getting the right output but in dec so I take it that the summing was in dec.. The right outputs should be either 13be or 5054 and I got 5054 so the cout<< must default to dec. see below: Sorry for ranting on a bit. Just could'nt get my head around it to start with! Hope it makes sense! Only beem writing C++ for about a fortnight, although I used to mess with Quick basic some years ago so it's mainly the more powerful commmands and syntax to get used to. comment etc, Peter. #include<iostream.h> int main() { unsigned long temp=0, counter=0, OutPut=0; char Letters[10]= "abcd"; // letter characters cout<<Letters; for (counter=1; counter<=strlen(Letters); counter++) { temp = Letters[counter-1]; // get character of char OutPut=OutPut +temp; // add result (temp) to OutPut } OutPut=OutPut ^ 1234; //means1234 h cout<<OutPut<<"\n"; // decimal output by default cout<<hex<<OutPut; // Hex output return 0; } Dec 02 2002
I believe the problem is being caused by the way you are representing 1234 hex. 1234 hex is represented by 0x1234. so the xor statement should be: Output = Output ^ 0x1234; Run the following: #include<iostream.h> #include <string.h> int main() { unsigned long temp=0; char *s,Letters[10]= "abcd"; // letter characters cout << Letters << endl; for (s = Letters; *s;s++) temp += *s; // sum total of the characters cout << "sum total of \"" << Letters << "\" give temp = " << temp << " (dec) " << hex << temp << " (hex)" << endl; temp ^= 0x1234; // xor temp with 1234 hex cout << "Xor temp with 1234hex = \t" << temp << " (dec) " << hex << temp << " (hex)" << endl; return 0; } Peter wrote:Hello Matthew, thanks for the reply, I've tried your code and it works fine for char(numbers) but char(letters) seem to be an invalid input, returns 0. As you may have gathered, I'm new to c++ so I keep experimenting. This is the type of output I'm after: Assume a char byte is saved. I am trying to get it's dec or hex value. ie: char hex dec "X" = 58 88 "x" = 78 120 "y" = 79 121 "z" = 7A 122 --------------------------------------------------- Actually I've just solved it! see below: char Letters. get loaded with "abcd" and the long int temp. accepts the values. The problem now is I don't know if the values are in hex or dec as the cout<< might be defaulting the output to dec. Ok, I've added an xor with 1234h if the val in temp is hex then according to my calculator the output should be either 13be-hex or 5054-dec depending on how << is affecting it. abcd == 18A == 394 dec. Output = 394 ? abcd xor 1234h = 1368 , don't add up! abcd xor 4660 ie. dec equiv. , now I'm getting the right output but in dec so I take it that the summing was in dec.. The right outputs should be either 13be or 5054 and I got 5054 so the cout<< must default to dec. see below: Sorry for ranting on a bit. Just could'nt get my head around it to start with! Hope it makes sense! Only beem writing C++ for about a fortnight, although I used to mess with Quick basic some years ago so it's mainly the more powerful commmands and syntax to get used to. comment etc, Peter. #include<iostream.h> int main() { unsigned long temp=0, counter=0, OutPut=0; char Letters[10]= "abcd"; // letter characters cout<<Letters; for (counter=1; counter<=strlen(Letters); counter++) { temp = Letters[counter-1]; // get character of char OutPut=OutPut +temp; // add result (temp) to OutPut } OutPut=OutPut ^ 1234; //means1234 h cout<<OutPut<<"\n"; // decimal output by default cout<<hex<<OutPut; // Hex output return 0; } Dec 03 2002
Hello Al, Much more eloquently written than my version! I ran Your example and it brought to light what should have been obvious to me all along. You see I was getting this hang-up over what the temp value was! If it was in hex then to get a correct result it had to be xor'ed with your (corrected) 1234h not 2660 dec. So why was yours AND my version working? The penny finally dropped!. The hex and dec figures are only representative of the same binary value meaning that it makes no difference what base you use at the xor stage. ie. they can be mixed. Only the output is converting binary to what readable form you require. Thanks for the help!. I'll probably be asking more questions as I get deeper into the C++ jungle. Peter. Dec 04 2002
|