How do I copy or rewind *argv[]


 
Thread Tools Search this Thread
Top Forums Programming How do I copy or rewind *argv[]
# 1  
Old 07-29-2011
How do I copy or rewind *argv[]

I'm working on my own pow function and I need to make a copy of *argv[] but
I think that I am having trouble with the size of *argv[] and the size of any array that I
make. The code below isn't working for me. and I want to accept any number no
matter the size with pow -f 2 2. I was working out the input issues but I need an
array that will copy *argv[] so that I can iterate through *argv[]. Or I need a function
that will rewind *argv[].
Code:
    char *arg[3];
     for(i=1; 1<4; i++)
     {
         if(i< argc)
             arg[i] = argv[i];
     }

Here is one of the reasons I need to rewind or copy *argv[], also this isn't
homework or anything. I am using this for my pow function and atoi doesn't check
whether or not the string itself is a number or not.
Code:
    for(;*argv[1] && !isspace(*argv[1]);*argv[1]++)

# 2  
Old 07-29-2011
Simply capturing the pointer in argv[i] doesn't make a copy of the string that argv[i] points to.

Also, you've picked up on the fact that argv[1] is the first command line parameter, but you're going to possibly cause a segment fault with your code because your target array is zero based. Your assignment should be something like this with the definition of your array:

Code:
arg[i-1] = strdup( argv[i] );  /* make a copy of the string */

If you must index into a string (any string, not just argv[x]), it is wise to allocate a character pointer and advance that along so that you never lose the pointer to the head of the string.

Code:
   char *sp;           /* pointer into string */

   for( sp = argv[1];  isspace( *sp ); sp++ );  /* CAUTION! empty body */
   
   /* *sp will point to first non-whitespace character in the string or the end of string (0) */

Hope this helps.

Last edited by agama; 07-29-2011 at 10:39 PM.. Reason: clarification
# 3  
Old 07-30-2011
Could you explain some of that stuff?

You don't have to if you don't want to but I am still confused at how to fix the for loop.
Is there anything else I could search for other the isspace to tell the for loop when to
stop. Because the only problem I am seeing other then not accepting appropriate input
is having to change argv and I still don't understand what the fix did. You posted use the
code below but I don't understand what it does. could you iterate? Also what exactly
do I have to match that will tell me when the end of an argument has been reach. I tried
to print the last argument with printf and all did was print something empty. God only I
can't tell if the end of the argument is '\0' '\n' or anything of that nature. Basically if I enter
"pow eric justin allan" what will *argv[1]+4 equal? Will it be '\n'.? Also what should i equal,
in the code below.
Code:
argd[i-1]

# 4  
Old 07-30-2011
Here's a small programme that will search through all command line parameters and print each out. It will also scan each parameter and print whether or not it contains all digits (leading whitespace is discarded such that " 123" is considered all digits. It should illustrate how to know when to stop processing command line arguments.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* return true if string contains all digits
   skips leading whitespace if skip_lws is !0
*/
int all_digits( const char *buf, int skip_lws  )
{
    const char  *sp;            /* pointer into buffer */
    int     all_dig = 1;    /* state of string */

    sp = buf;
    if( skip_lws )      /* skip leading whitespace when asked*/
        for( ; *sp && isspace( *sp ); sp++ );

    if( ! *sp )
        return 0;       /* empty string -- return false (no digits) */

    for( ; *sp; sp++ )      /* for each character until \0 */
        if( ! isdigit( *sp ) )  /* return false on first non-digit found */
            return 0;

    return 1;       /* if we finish the loop, we saw all digits */
}

int main (int argc, const char **argv)
{
    int i;

    fprintf( stderr, "there are %d arguments on the command line\n", argc-1 );

    for( i = 1; i < argc; i++ )         /* for each argument */
    {
        fprintf( stderr, "parameter %d = %s\n", i, argv[i] );
        if( all_digits( argv[i], 1 ) )
            fprintf( stderr, "\targument is all digits\n" );
        else
            fprintf( stderr, "\targument is NOT all digits\n" );
    }

    return 0;
}

Arguments from the command line are zero terminated. From the example above the statement for( ; *sp; sp++ ) will stop when the character pointed to by sp is zero. It is the same as using:
Code:
for( ; *sp != 0; sp++ )

So, to answer your question about what *argv[1]+4 will equal when argv[1] is "eric" -- it should be zero.

Quote:
Also what should i equal,
in the code below.
Code:
argd[i-1]

I'm not sure what you are asking here.
# 5  
Old 07-31-2011
Do you mind if I ask you another question?

Moderator's Comments:
Mod Comment Please, just ask it...
# 6  
Old 08-02-2011
It's a network question. The code below doesn't work. Do you have any idea how
to receive data about the connecting networks?
Code:
accept(simpleSocket, (struct sockaddr *)&dest, NULL);

---------- Post updated at 09:13 PM ---------- Previous update was at 09:13 PM ----------

I wanna thank you for the code above also.
# 7  
Old 08-02-2011
Are you getting an error from the accept? It would also help to see how you initialise simpleSocket and any messages that the process that is trying to connect to your programme is reporting.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

ARGV how to use it?

So i am trying to read in file readFile <GivenFile> modFile looking for a regular file under the directories in the GivenFile and print them out is my over all goal. basically I am looking for anything that looks like a directory in the given file and printing it out. Since I am trying to do... (2 Replies)
Discussion started by: squidGreen
2 Replies

2. UNIX for Advanced & Expert Users

O argv, argv, wherefore art thou argv?

All of my machines (various open source derivatives on x86 and amd64) store argv above the stack (at a higher memory address). I am curious to learn if any systems store argv below the stack (at a lower memory address). I am particularly interested in proprietary Unices, such as Solaris, HP-UX,... (9 Replies)
Discussion started by: alister
9 Replies

3. Programming

help with C, argv

when i run my program, i have a parameter, that i want to set the value to another string i am using int main(int argc, char **argv) { char my_str=argv; printf("%s",my_str); return 0; } and i get Segmentation fault ran using ./my_prog /usr/share/dict/words hello1 ... (2 Replies)
Discussion started by: omega666
2 Replies

4. Programming

ARGV help in C

Hi, Can somehelp help how to list file in a dir? (5 Replies)
Discussion started by: Learnerabc
5 Replies

5. UNIX for Dummies Questions & Answers

Need help to understand cpio and no rewind tapes

SCO openserver 5r5 I only have this available to me ... To list the files... cpio -itcvB < /dev/nrct0 To copy a file out cpio -icvdBum filename < /dev/nrct0So cpio is to archive or "zip" files up?? and /dev/nrct0 is the tape drive ??? How can i list all the files inside... (2 Replies)
Discussion started by: khaos83_2000
2 Replies

6. Shell Programming and Scripting

if #argv = (this OR that) then...

this is in one of my scripts... if ($#argv == 0) then echo 'blah bla' exit 0 endif I want it to be something like this... if ($#argv == 0 OR $argv >=3) echo 'blah bla' exit 0 endif so when the arguments are none, or greater than three I want this "if then" to take over. how? I... (5 Replies)
Discussion started by: ajp7701
5 Replies

7. Programming

Problem with fgets and rewind function ..

Hello Friends, I got stuck with fgets () & rewind() function .. Please need help.. Actually I am doing a like, The function should read lines from a txt file until the function is called.. If the data from the txt file ends then it goes to the top and then again when the function is called... (1 Reply)
Discussion started by: user_prady
1 Replies

8. Programming

help for argv argc

Hi C experts, I have the following code for adding command line option for a program int main (argc, argv) int argc; char *argv; { char *mem_type; //memory type char *name; //name of the memory int addr; //address bits int data; ... (5 Replies)
Discussion started by: return_user
5 Replies

9. UNIX for Dummies Questions & Answers

What is the function of rewind()?

What is the function of rewind()? (2 Replies)
Discussion started by: tigerkin
2 Replies

10. Programming

argv

I have a program which I wish to modify. It used to be run from the command line, but now I wish to change this so it can be used as a function. The program has complex argument processing so I want to pass my paramters to as if it were being called by the OS as a program. I have tried to... (2 Replies)
Discussion started by: mbb
2 Replies
Login or Register to Ask a Question