Вы забыли выделить место для string1
, scanf
не выделит вам память, вы должны сделать это самостоятельно. Кроме того, string2
указывает на недоступную для записи память, и у нее недостаточно места для добавления string1
к ней, так что ваш strcat
будет переполнен, даже если у вас есть char string2[] = "tar czvf YourNewFile.tar.gz ";
.
Вот аннотированная версия чего-то, что ближе к тому, что вы действительно хотите:
#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;
}
Кто-нибудь, пожалуйста, дайте мне знать, если я допустил какие-либо ошибки по одному.
Справочный материал по функциям приведен выше здесь .