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
>
>
>

Reply via email to