gpt4 book ai didi

c - 删除C中的特殊字符

转载 作者:行者123 更新时间:2023-11-30 21:30:36 24 4
gpt4 key购买 nike

我必须编写 C 程序而不使用任何包含库。根据我的要求,获取命令行参数并写入文件。当我写入文件时,它会写入特殊字符(垃圾)。请为此提供解决方案。只能使用 read() 和 write() 函数。

#define O_WRONLY 01
#define O_APPEND 02000

int main(int argc, char *argv[])
{
int fd;
fd = open("testfile.txt", O_WRONLY|O_APPEND, 0);
if(fd < 0 )
return 1;
if(argc != 4)
{
char bufMsg[] ="Parameters are missing!\n" ;
write(1, bufMsg, sizeof(bufMsg));
return 1;
}
else
{
int i = 0;
for (i = 1; i < argc; i++)
{
write(fd, argv[i],sizeof(argv[i]));
write(fd, " ",1 );
}
write(1, "\n", 1);
close(fd);
}
return 1;
}

最佳答案

让我们首先帮助您解决问题的第一部分。正如BLUEPIXY指出的,sizeof(argv[i])指向char的指针的大小(sizeof(char*))不是字符串的长度。因此,您可以包含 string.h 并使用 strlen 函数,也可以编写自己的函数。使用 strlen 函数,您可以执行以下操作:

...
write(1, bufMsg, strlen (bufMsg));
...
write(fd, argv[i], strlen (argv[i]));

您可能还想修复:

write(1, "\n", 1);  /* I suspect write(fd, "\n", 1); was intended */

在我们提供帮助的同时,您确定要重新定义吗:

#define O_WRONLY 01
#define O_APPEND 02000

这些值可能是完全正确的(我没有检查),但为什么你首先要这样做呢?头文件已经为您定义了它们。

为了回应您关于无法包含任何库的评论,虽然不清楚您是指头文件还是其他文件,但您可以通过多种方式获取字符串的长度,而无需使用strlen。例如,您可以使用以下 slen 函数代替 strlen:

size_t slen (char *str) 
{
char *p = str;
size_t ln = 0;

if (!p)
return -1;

while (*p++ != '\0')
ln++;

return ln;
}

关注您的进一步评论。为了编译和运行该程序,您至少需要包含打开写入文件所需的头文件。否则你的应用程序将无法编译。您可以依靠退出应用程序来关闭打开的文件描述符,但由于所需的头文件也提供 close ,因此您可以包含 close 以保持完整性。有了这个附带条件,只允许用户打开和写入的程序的最低功能方法将是:

#include <fcntl.h>
#include <unistd.h>

size_t slen (char *str)
{
size_t ln = 0;
if (!str) return -1;
while (*str++ != '\0') ln++;
return ln;
}

int main (int argc, char *argv[])
{
int fd;

if (argc != 4)
{
char bufMsg[] ="Error, incorrect arguments.\n usage: prog arg_1 arg_2 arg_3\n";
write (1, bufMsg, slen (bufMsg));
return 1;
}

fd = open ("testfile.txt",
O_WRONLY|O_CREAT|O_APPEND,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if (fd < 0 )
{
char fileMsg[] = "Error opening file\n";
write (1, fileMsg, slen (fileMsg));
return 1;
}
else
{
int i = 0;
for (i = 1; i < argc; i++)
{
write (fd, argv[i], slen (argv[i]));
write (fd, " ", 1);
}
write (fd, "\n", 1);
close (fd);
}

return 0;
}

构建:

gcc -Wall -Wextra -o bin/ow onlywrite.c

运行:

./bin/ow Argument_1 Argument_2 Argument_3

输出:

$ ls -al testfile.txt
-rw-r--r-- 1 david david 34 Jul 30 02:52 testfile.txt
$ cat testfile.txt
Argument_1 Argument_2 Argument_3

关于c - 删除C中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25006485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com