我需要使用系统调用编写程序来读取文件,反转字符串并将其打印到输出文件。如果输入文件为test.txt
,则应将输出写入文件reverse_test.txt
。请告诉我如何将字符串reverse_
附加到输出文件的名称,我将在其中写出结果。
我尝试了下面的代码,但它给出了错误。
strcat("reverse_",argv[1]);
我已经编写了其余代码,但它工作正常,但无法解决这一部分。
答案 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_”。可以肯定的是,您将无法更改其长度,因为在此过程中您将破坏代码中的其他文字。
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 );
希望这有帮助。