I am making a command line program in C us开发者_StackOverflow中文版ing XCode. When running the program, it initially does what it is supposed to do (asks me for a file path). However, when I type in a valid and existing file path, it gives me the following error:
Program received signal: “EXC_BAD_ACCESS”. sharedlibrary apply-load-rules all (gdb)
I have two warnings in my program, both of which have to do with the function strcat. The warnings are:
warning: implicit declaration of function 'strcat'
and
warning: incompatible implicit declaration of built-in function 'strcat'
I am wondering why my program is not executing properly.
Thanks, Mike
My code is posted below:
#include "stdlib.h"
int main (void)
{
char *string1;
printf("Type in your file path: ");
scanf("%s", string1);
char *string2 = "tar czvf YourNewFile.tar.gz ";
strcat(string2, string1);
system(string2);
}
Maybe it has to do with allocating the chars?
You forgot to allocate space for string1
, scanf
will not allocate memory for you, you have to do that yourself. Furthermore, string2
points at non-writeable memory and it doesn't have enough room to append string1
to it anyway so your strcat
would overflow even if you had char string2[] = "tar czvf YourNewFile.tar.gz ";
.
Here's an annotated version of something that's closer to what you really want:
#include <stdio.h> /* printf, sprintf, fgets */
#include <string.h> /* strcat, strlen */
#include <stdlib.h> /* malloc */
#define TAR "tar czvf YourNewFile.tar.gz"
int main(void) {
char path[100] = { 0 }; /* Initialize to all 0 bytes. */
char *cmd; /* We'll allocate space for this later. */
int len;
printf("Type in your file path: ");
fgets(path, sizeof(path), stdin); /* Read at most 100 characters into path */
/*
* Remove the trailing newline (if present).
*/
len = strlen(path);
if(path[len - 1] == '\n')
path[len - 1] = '\0';
/*
* Allocate room for our command.
*/
cmd = malloc(
strlen(TAR) /* Room for the base tar command. */
+ 1 /* One more for the space. */
+ strlen(path) /* Room for the path we read. */
+ 1 /* One more for the final nul terminator. */
);
/*
* You could also use a bunch of strcpy and strcat stuff for
* this but sprintf is less noisy and safe as long as you've
* properly allocated your memory.
*/
sprintf(cmd, "%s %s", TAR, path);
/*
* This is vulnerable to unpleasant things in `path` (such as spaces,
* &, >, <, ...) but this will do as a learning exercise. In real life
* you'd probably want to use fork and exec for this to avoid the
* interface issues with the shell.
*/
system(cmd);
/*
* Free the memory we allocated.
*/
free(cmd);
/*
* You need a return value because of "int main(...)". Zero is
* the standard "all's well" return value.
*/
return 0;
}
Someone please let me know if I've made any off-by-one errors.
You can find reference material for the functions in the above over here.
Examine this line:
char *string1
and this line:
scanf("%s", string1);
You have not declared a size for string1, meaning that you will always get an error, fix it with something like this:
char string1[100]
If 100 is the maximum length of your input.
Or read your input character by character.
And, to get rid of the warnings, add #include "string.h"
to where your #include
statements are.
精彩评论