I've come up with a couple of reasonably straight-forward solutions to my 
problem, but first, thanks to everyone who offered suggestions. Even though I 
didn't choose to use them, your willingness to make them is definitely 
appreciated.

Here are my solutions (note that there are 2, one labelled "attack from the 
rear", the other labelled "frontal attack").  I won't claim that they have been 
really thoroughly tested, but I have tried a variety of values for testString, 
d, digitsPerAllele and alleles and both methods appear to work.  If anyone sees 
a problem or an improvements, please let me know.  Right now, I favor the 
frontal attack, which occurred to me in the middle of the night -- I seldom 
have reason to use the % operator and so didn't think of it right away.  Of 
course, in actual use, I'll first take steps to separate the string that's 
being processed into substrings, if the original string uses a ";" (for 
example) to separate allelic values, e.g. if the string being processed is 
04;756;013.

    NSString *testString = @"0756013";
    NSUInteger d = 3;
    NSUInteger digitsPerAllele = d;
    NSUInteger alleles = 3;
    
    NSString *subString;
    NSRange range;
    int theInt;
    
    // attack from the rear
    int startOfRange = [testString length];
    int length = d;
    int i;
    for (i = 0; i < alleles; i++ ) {
        startOfRange = startOfRange-d;
        if (startOfRange < 0) {
                length = length + startOfRange; // note that startOfRange is 
negative here
                if (length <= 0)
                break;
            startOfRange = 0;
            d = length;
                }
        range.location = startOfRange;
        range.length = d;
        subString = [testString substringWithRange:range];
        theInt = [subString intValue];
    }

    // frontal attack
    testString = @"04756013";
    int remainder = [testString length] % digitsPerAllele;
    range.location = 0;
    range.length = remainder;
    subString = [testString substringWithRange:range];
    theInt = [subString intValue];
    --alleles;
    range.location = remainder;
    range.length = digitsPerAllele;
    for (i = 0; i < alleles; i++ ) {
        subString = [testString substringWithRange:range];
        theInt = [subString intValue];
        range.location += digitsPerAllele;
    }


On Aug 10, 2013, at 10:07 AM, Boyd Collier <bcolli...@cox.net> wrote:

> I'm dealing with a situation in which I have to scan strings that are 
> separated by tabs, and for each string, I have to extract two numerical 
> values, with these values being separated by a non-numerical character or not 
> being separated by any character at all.  I know the maximum number of 
> characters used to represent each number, but unfortunately, the first 
> character in the group of characters used to represent the first number can, 
> quite arbitrarily, be either a 0 or missing.  For example, with the number of 
> characters used to represent each number known to be 2, the strings 607, 
> 0607, 06;07 (note the semicolon between 06 and 07) should all result in 6 and 
> 7 being extracted as the two numerical values. Of course, I'd like to do 
> something simple, and were it not for the arbitrary inclusion of a leading 0, 
> it would be quite simple to use an instance of NSScanner.  Or, if there were 
> such a beast as NSReverseScanner, it would also be relatively straight 
> forward, but so far as I'm aware, no such beast exists. I can think of a 
> couple of ways do accomplish this task, but if someone has already come up 
> with a clean way of scanning in reverse, I'd appreciate hearing from them.
> 
> Boyd

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to