将字符串附加到c中的输入文件名

时间:2011-08-19 09:38:52

标签: c string-concatenation

我需要使用系统调用编写程序来读取文件,反转字符串并将其打印到输出文件。如果输入文件为test.txt,则应将输出写入文件reverse_test.txt。请告诉我如何将字符串reverse_附加到输出文件的名称,我将在其中写出结果。

我尝试了下面的代码,但它给出了错误。

strcat("reverse_",argv[1]); 

我已经编写了其余代码,但它工作正常,但无法解决这一部分。

3 个答案:

答案 0 :(得分:6)

您无法附加到文字“reverse_”。尝试这样的事情:

char str[ENOUGH] = {0};
snprintf(str, sizeof(str), "reverse_%s", argv[1]);

答案 1 :(得分:1)

在您的示例中,“reverse_”是一个字符串常量字面值,并且您尝试将其他一些内存位置附加到常量字面值,这是不可能的。

您可以执行以下操作:

 char *buffer;

 buffer = malloc (sizeof (char) * BUFSIZ);

 strcpy (buffer, "reverse_");
 strcat (buffer, argv[1]);

 /* Work here */

 free (buffer); /* before termination */  

或者您也可以将缓冲区定义为长度为BUFSIZ的静态数组。

答案 2 :(得分:1)

strcat()标准库函数接受两个参数:目标和源字符串。

这意味着,当你尝试这样的事情时:

strcat( "reverse_", argv[1] );

你实际上是这样说的:

"reverse_" = "reverse_" + argv[ 1 ]

..这是不正确的,因为你不能修改(或者,至少,你不应该)文字“reverse_”。可以肯定的是,您将无法更改其长度,因为在此过程中您将破坏代码中的其他文字。

@cnicutar已经向您提供了有关如何实现您正在寻求的结果的提示,但如果您想遵守您所遵循的流程,请在此解释:

a)您需要在内存中保留一个存储反转文件名的位置。

b)你需要在那里写“reverse_”。

c)最后,您需要在argv [1]

中连接文件名

第一步是令人震惊的最困难的一步。需要多少空间?给定的文件名最多可以包含255个字符:

http://en.wikipedia.org/wiki/NTFS

http://en.wikipedia.org/wiki/Ext4

...但是,没有什么能阻止用户输入绝对路径或相对路径。这意味着我们可能应该给出命令行可以处理的最大字符长度,即......

http://support.microsoft.com/kb/830473

¡8192个字符!...这导致我们无处可去。

一个更好的方法,导致最佳准确性,是计算argv [1]字符串中的字符数,然后添加前缀所需的字符,并保留该数量加一,因为我们还需要存储字符串结尾的标记:

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 );

如果您不能使用这些矢量,则应保留并使用动态内存。

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 );

希望这有帮助。