Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C字符串中写入和读取多个单词_C_Linux_String_Fifo - Fatal编程技术网

如何在C字符串中写入和读取多个单词

如何在C字符串中写入和读取多个单词,c,linux,string,fifo,C,Linux,String,Fifo,我在做这个程序,在这个程序中我有两个进程,服务器和客户端。服务器必须从输入中读取字符串,然后写入FIFO文件。客户端必须从FIFO文件中读取字符串,然后写入.txt文件。 这是唯一负责服务器和客户端的功能。文件FIFO和fork'ing在主函数中执行 void server(void) { FILE *fp1, *fp2; char string[100]; while(1) { fp1 = fopen("FIFO1", "w");

我在做这个程序,在这个程序中我有两个进程,服务器和客户端。服务器必须从输入中读取字符串,然后写入FIFO文件。客户端必须从FIFO文件中读取字符串,然后写入.txt文件。 这是唯一负责服务器和客户端的功能。文件FIFO和fork'ing在主函数中执行

void server(void)
{
    FILE *fp1, *fp2;
    char string[100];

    while(1)
    {
        fp1 = fopen("FIFO1", "w");
        fprintf(stdout, "Type string: ");
        scanf("%s", string);
        fputs(string, fp1);
        fclose(fp1);

        sleep(1);
    }
}
void client(void)
{
    FILE *fp,*fp1;
    char string[100];
    while(1)
    {
        fp = fopen("FIFO1", "r");
        fgets(string, 100, fp);
        fclose(fp);
        fp1 = fopen("file.txt", "a");
        fprintf(fp1,"%d_file: I get: %s\n", getpid(), string);
        fclose(fp1);    
    }
}
我的问题是,当我键入一个类似“stack overflow”的字符串时,当我有两个单词时,在我的
file.txt
中,我会得到以下行:

8965_file: I get: stack
8965_file: I get: overflow
有没有办法把这写在一行上?像这样:

8965_file: I get: stack overflow

这是因为
scanf()
%s“
说明符出现空白时停止读取,请将其更改为
%99[^\n]”
或改用
fgets()
,但请记住
fgets()
将读取
'\n'
fputs()
将添加一行,这样您可能会得到比您想要的更多的行

提示:对于数组,使用
fgets(string,sizeof(string),fp)
使代码更易于维护。

您可以使用
get(string)
获取多个单词,而不是使用
scanf()


参考链接:

put()
添加了换行符,
fputs()
没有。我将“%s”更改为“%99[^\n]”,我得到了奇怪的行为,因为程序在屏幕上多次写入,我无法计数,“键入字符串:”并在文件中多次写入“8965\u文件:我得到:堆栈溢出”,然后结束:(你知道为什么吗?gets是危险的,因为你没有指定缓冲区的长度,所以输入太多会导致缓冲区溢出——使用
fgets()
insteadt works:)我有一个警告,gets函数是危险的,不应该使用。原因如下:@John Hascall谢谢:)我将服务器中的scanf改为fgets(string,sizeof(string),stdin);