At 8/24/2007 08:14 PM, you wrote:
>I gave it a try ....
>Better code (with same algo) ... it works !!!
>
>//in place decompression of a string.
>//freq<10
>main ()
>{
> char str[100]="a4b6c2d7g9";
> int i,freq,len,j,k,curr_char,room;
> printf ("\n%s\n",str);
> for(i=0;str[i]!=0;)
> {
> if(str[i]>='a' && str[i]<='z')
> {
> i++;
> freq=str[i]-48; //convert next digit to integer.
> room=freq-2;
> len=strlen(str);
> for(j=len; j>i
> ;j--) //shift the string to right and make room for expansion.
> {
> str[j+room]=str[j];
> }
> printf ("\n%s\n",str);
> j=i;
> curr_char=str[i-1];
> for(k=0;k<=room;k++) //expand
> {
> str[j]=curr_char;
> j++;
> i++;
> }
> printf ("\n%s\n",str);
> }
> else
> {
> //error !!!
> }
> }
> // and done !!! :)
> printf ("\n%s\n",str);
>
>}
It works with the supplied data. But if the
increment count is only one, it fails. I've fixed
that, and also checked for invalid entries (i.e.
an entry must consist of a letter/number
combination. Upper case letters are allowed.).
To more easily check different combinations, I
let the user enter the entry pairs.
~Rick
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
// in-place decompression of a string.
// freq < 10
char str[100]="a4b6c2d7g9";
int i,freq,len,j,k,curr_char,room;
int err = 0;
cout << "Enter letter/count combinations: ";
cin >> str;
cout << "You entered " << str << endl;
for (i = 0; str[i] != 0;)
{
if (err) // Shift the string left 2
positions to delete the bad entry
{
k = i; // Point k to current entry
i -= 2; // Decrement i to overwrite bad entry
j = i; // Point j to new entry point
cout << endl << "Removing bad entry ["
<< str[i] << str[i+1] << "]" << endl;
do
{
str[j++] = str[k++];
} while (str[k]);
str[j] = '\0'; // Terminate the string
cout << str << endl;
err = 0;
}
if ( (str[i] >= 'a' && str[i] <= 'z')
|| (str[i] >= 'A' && str[i] <= 'Z') )
{
i++;
if (str[i] >= '0' && str[i] <= '9')
{
freq=str[i]-48; // Convert next digit to integer.
if (freq == 1) // Shift the string LEFT one position
{
k = i + 1; // Point k to next entry
j = i; // Point j to count
do
{
str[j++] = str[k++];
} while (str[k]);
str[j] = '\0'; // Terminate the string
}
else // Shift
the string to right and make room for expansion.
{
room=freq-2;
len=strlen(str);
for (j=len; j>i ;j--)
{
str[j+room]=str[j];
}
cout << endl << str << endl;
j = i;
curr_char = str[i-1];
for (k = 0; k <= room; k++) //expand
{
str[j] = curr_char;
j++;
i++;
}
}
cout << str << endl;
}
else
{ //error !!!
cout << endl << str[i] << " is not a numeric value!" << endl;
i++;
err = 1;
}
}
else
{ //error !!!
cout << endl << str[i] << " is not an alpha character!" << endl;
i++;
i++;
err = 1;
}
} // and done !!! :)
printf ("\n%s\n",str);
// system("PAUSE");
return EXIT_SUCCESS;
}
>----- Original Message ----
>From: Thomas Hruska <[EMAIL PROTECTED]>
>To: [email protected]
>Sent: Saturday, 25 August, 2007 5:13:41 AM
>Subject: Re: [c-prog] decomress a string "a2b3c4" to aaaabbbcccc
>
>David wrote:
> > Thomas Hruska a écrit :
> >> kou ksk wrote:
> >>
> >>>> Why are you bothering to even manipulate the string? On many compilers,
> >>>> the code will "crash" (GPF) because you will be attempting to modify
> >>>> read-only memory.
> >>>>
> >>> Thomas,
> >>> I am afraid that this is not at all true
> for this code and in widely used compilers including
> >>> gcc, borland. What you are saying is right for :
> >>>
> >>> char *p="hello";
> >>> p[1]='2'; //this will crash on gcc
> >>>
> >>> but, as in Anurag's code,
> >>> char p[]="hello";
> >>> p[1]='2'; //this will not at all crash !!!!
> >>>
> >>> -kou.
> >>>
> >> Tempting fate is always a bad idea. From my perspective, both are
> >> identical and interchangeable. An overzealous optimizing compiler (e.g.
> >> Intel*) may think the same way.
> >>
> >> * Intel's optimizing compiler suite couldn't/can' t be used, for
> >> instance, to compile the Linux kernel. (Or at least it used to not be
> >> able to because it was overzealous in its optimizations - at least that
> >> was the explanation I received).
> >>
> >>
> >
> > I don't know much C,
> > But can you clarified this : "both are identical" ?
> > I am not sure to understand.
> >
> > I don't have intel icc compiler to see
> assembly generated by both code But it could be
> interested to see what will be generated by
> (two initialization with the same literal c-string)
> >
> > char* q = "abcdef"; // could be (as with aCC) a warning for C++
> > char* p = "abcdef";
> >
> > And
> >
> > char q[] = "abcdef";
> > char p[] = "abcdef";
> >
> > David
>
>I don't have access to the Intel compiler (but I'd love to try it
>sometime and see if it is everything it claims to be).
>
>My guess (without actually trying it) is the assembler generated for the
>above is most likely _identical_. The difference is going to be where
>in the final executable the compiler decides to dump the strings
>(read-only or read/write memory).
>
>--
>Thomas Hruska
>CubicleSoft President
>Ph: 517-803-4197
>
>*NEW* MyTaskFocus 1.1
>Get on task. Stay on task.
>
>http://www.CubicleS oft.com/MyTaskFo cus/
>
>
>
>
>
> Why delete messages? Unlimited storage is
> just a click away. Go to
> http://help.yahoo.com/l/in/yahoo/mail/yahoomail/tools/tools-08.html
>
>[Non-text portions of this message have been removed]
>
>
>
>To unsubscribe, send a blank message to
><mailto:[EMAIL PROTECTED]>.
>Yahoo! Groups Links
>
>
>