如何在C字符串中写入和读取多个单词
我在做这个程序,在这个程序中我有两个进程,服务器和客户端。服务器必须从输入中读取字符串,然后写入FIFO文件。客户端必须从FIFO文件中读取字符串,然后写入.txt文件。 这是唯一负责服务器和客户端的功能。文件FIFO和fork'ing在主函数中执行如何在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");
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);