问题
I need to write a program using system calls to read a file, reverse the string and print it out to an output file. If the input file is test.txt
, output should be written to file reverse_test.txt
. Please let me know how I can append the string reverse_
to the name of the output file where I would be writing the results.
I tried the code below but it gives error.
strcat("reverse_",argv[1]);
I have written the rest of the code and it works fine but unable to solve this part.
回答1:
The strcat() standard library function accepts two parameters: the destination and the source string.
This means that, when you try something like this:
strcat( "reverse_", argv[1] );
You're actually saying something like this:
"reverse_" = "reverse_" + argv[ 1 ]
..which is incorrect, since you cannot modify (or, at least, you shouldn't) the literal "reverse_". It is certain that you won't be able to change its length, since in the process you'd be breaking other literals of use in your code.
@cnicutar has given you a hint about how to achieve the result you are seeking, but in case you would like to adhere to the process you were following, here is the explanation:
a) You need to reserve a place in memory in which you will store the reversed file name.
b) You need to write "reverse_" there.
c) Finally, you need to concat the file name in argv[ 1 ]
The first step is shockingly the most difficult one. How much space is needed? A given file name can be of a maximum of 255 characters:
http://en.wikipedia.org/wiki/NTFS
http://en.wikipedia.org/wiki/Ext4
...however, nothing stops the user of entering an absolute or relative path. This means that probably we should give the maximum character length that the command line can handle, which is...
http://support.microsoft.com/kb/830473
¡8192 characters!... this is leading us nowhere.
A much better method, leading to best accuracy, is to count the number of characters in the argv[ 1 ] string, then add the characters needed for the prefix, and reserve that amount plus one, since we need to also store the mark for the end of string:
const char * prefix = "reserve_";
int needed = strlen( argv[ 1 ] ) + strlen( prefix ) + 1;
char store[ needed ];
strcpy( store, prefix ); // store <- prefix
strcat( store, argv[ 1 ] ); // store <- store + argv[ 1 ]
printf( "%s\n", store );
In case you cannot use these kind of vectors, you should reserve and use dynamic memory.
const char * prefix = "reserve_";
int needed = strlen( argv[ 1 ] ) + strlen( prefix ) + 1;
char * store = (char *) malloc( sizeof( char ) * needed );
strcpy( store, prefix ); // store <- prefix
strcat( store, argv[ 1 ] ); // store <- store + argv[ 1 ]
printf( "%s\n", store );
free( store );
Hope this helps.
回答2:
You can't append to the literal "reverse_". Try something like this:
char str[ENOUGH] = {0};
snprintf(str, sizeof(str), "reverse_%s", argv[1]);
回答3:
in your example "reverse_" is a string constant literal and you are attempting to append some other memory locations to the constant literal, which is not possible.
You can do the following:
char *buffer;
buffer = malloc (sizeof (char) * BUFSIZ);
strcpy (buffer, "reverse_");
strcat (buffer, argv[1]);
/* Work here */
free (buffer); /* before termination */
Or you can also define the buffer as a static array with BUFSIZ
length.
来源:https://stackoverflow.com/questions/7119718/appending-string-to-input-file-name-in-c