2011-08-19 96 views
1

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

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

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

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

回答

1

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

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

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

你实际上是在说这样的事情:

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

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

@cnicutar给你一个关于如何实现你正在寻找的结果提示,但如果你想坚持你关注这一进程,这里的解释是:

一)您需要在存储器中保留一个地方,在其中存储反转的文件名。

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

C)最后,你需要Concat的argv中的文件名[1]

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

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

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

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

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

¡8192个字符!...这是无处领导我们。

一个更好的方法,导致最好的准确性,是计算argv [1]字符串中的字符数,然后添加前缀所需的字符,并将该数量加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); 

希望这会有所帮助。

+0

变量数组,仅限于C99。 – phoxis

+1

解决了由@phoxis指出的变量数组问题 – Baltasarq

+0

非常感谢。这工作像一个魅力。再次感谢 –

6

您不能附加到文字“reverse_”。尝试是这样的:

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

对不起,但我忘了提及,我将使用creat(2)系统调用来创建一个输出将被写入的新文件。使用creat(2)创建的文件的名称必须是reverse_test.txt。以 –

+0

为例:(fdw = creat(“outfile”,S_IREAD | S_IWRITE),这里outfile应该是reverse_argv [1]。我是新手并完成了一些任务。可能无法高效地解释 –

+1

问题是什么你只是把这个'str'传递给'creat(2)' – glglgl

1
在你的榜样“reverse_”

是一个字符串常量文字和要尝试一些其他的内存位置追加到常量文字,这是不可能的。

你可以做到以下几点:

char *buffer; 

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

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

/* Work here */ 

free (buffer); /* before termination */ 

或者你也可以定义缓冲与BUFSIZ长度的静态数组。

+0

以前的解决方案工作,但感谢您提供这样一个很好的方式来执行任务。提交作业后,我一定会试试这个。 –