删除C中的特殊字符

时间:2014-07-29 00:30:12

标签: c

我必须在不使用任何包含库的情况下编写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;     
}

2 个答案:

答案 0 :(得分:0)

让我们从帮助您解决问题的第一部分开始。正如BLUEPIXY指出的那样,sizeof(argv[i]) 指向字符的指针的大小 (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;
}

继续你的评论。为了编译和运行程序,您至少,需要包含openwrite文件所需的头文件。否则您的应用程序将无法编译。您可以依赖退出应用程序来关闭打开的文件描述符,但由于所需的头文件也提供close,因此您可以包含close以获得完整性。有了这个附带条件,您的程序的最小功能方法只会是openwrite的用户:

#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

答案 1 :(得分:0)

#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],strlength(argv[i]));
        write(fd, " ",1 );
    }
    write(1, "\n", 1);
    close(fd);
    }  
    return 1;     
}

int strlength(const char *str)
{
    const char *s;

    for (s = str; *s; ++s)
            ;
    return (s - str);
}