Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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代码跳过read()系统调用来执行下一个write()系统调用?_C_Linux_Operating System_Systems Programming - Fatal编程技术网

为什么下面的C代码跳过read()系统调用来执行下一个write()系统调用?

为什么下面的C代码跳过read()系统调用来执行下一个write()系统调用?,c,linux,operating-system,systems-programming,C,Linux,Operating System,Systems Programming,我的问题是关于Linux系统编程,特别是关于读写API 我正在编写一个复制shell的程序。它接受一个字符串参数并用空格分隔符标记它。根据第一个令牌的命令,它使用剩余的令牌作为参数执行操作。到目前为止,我只为“add”命令实现了这一点。代码在循环中运行,直到用户为“继续”输入“n”?[是/否]”。但是,在第一次迭代之后,我的程序在第一次调用enter命令的write()之后跳过read(),并在“continue?”write()调用结束。为什么它会在第一次写入()之后立即跳过read()调用

我的问题是关于Linux系统编程,特别是关于读写API

我正在编写一个复制shell的程序。它接受一个字符串参数并用空格分隔符标记它。根据第一个令牌的命令,它使用剩余的令牌作为参数执行操作。到目前为止,我只为“add”命令实现了这一点。代码在循环中运行,直到用户为“继续”输入“n”?[是/否]”。但是,在第一次迭代之后,我的程序在第一次调用enter命令的write()之后跳过read(),并在“continue?”write()调用结束。为什么它会在第一次写入()之后立即跳过read()调用

intmain(intargc,char*argv[]){
int真=0;
while(true==0){
char buff1[]=“请输入您的命令\n”;
int count1=strlen(buff1);
写入(标准输出文件号,buff1,count1);
char-buff2[100];
int count2=读取(标准文件号,buff2,100);
buff2[count2-1]='\0';
char*list[30];//这将创建一个字符指针(字符串)数组
/*
*开始标记化并在列表中输入标记
*/
常量字符delim[]=“”;
字符*令牌;
令牌=strtok(buff2,delim);
常量字符换行符[]=“\n”;
int i=0;
while(令牌!=NULL){
写入(STDOUT_文件号、换行符、strlen(换行符));
列表[i]=令牌;
写入(标准文件号,列表[i],标准文件名(列表[i]);
i++;
token=strtok(NULL,delim);
}
/*
*结束标记化
*/
/*
*开始加法运算
*/
常量字符添加[]=“添加”;
如果(strcmp(列表[0],添加)==0){
int结果=0;

对于(int j=1;j,您的程序具有未定义的行为

使用尚未初始化的指针指向任何有效的对象

线路

char *truefalse;
声明一个指针,但该指针尚未初始化为指向任何有效的对象。您可以在行中继续使用它

read (STDIN_FILENO, truefalse, 1);
而不是

char *truefalse;
char endmessage[]="Continue: [y/n]\n";
write (STDOUT_FILENO, endmessage, strlen(endmessage));
read (STDIN_FILENO, truefalse, 1);
使用


更新 代码不等待您在第二次迭代中输入任何内容的原因是换行符仍然保留在输入流中。第二次调用只读取换行符

在阅读了问题的答案后,您需要代码来跳过这一行的其余部分

最简单的方法是使用:

int c;
while ((c = fgetc(stdin)) != EOF && c != '\n');

非常感谢你指出这一点(双关语).然而,这仍然不能解决我的问题,我也得到了同样的结果output@OmerFarooqAhmed,为什么您要使用低级的
/
函数而不是
fread
/
fwrite
?讲师特别告诉我们现在要使用读/写,更新成功了,谢谢nding:1)始终缩进代码。在每个左大括号“{”.unindent在每个右大括号“};”之后缩进。建议每个缩进级别为4个空格。发布的代码未编译!。它缺少头文件所需的
\include
语句公开从C库调用的函数的原型。例如
stdio.h
string.h
unistd.h
关于:
char*truefalse;
read(STDIN\u FILENO,truefalse,1);
指针
truefalse
从未设置为指向应用程序拥有的某个内存。它将包含堆栈上的垃圾作为其位置。设置一个值,该值指向(因此)未定义的行为,并可能导致seg故障事件。调用
read()返回的值
应检查以确保操作成功。关于:
int main(int argc,char*argv[])
未使用参数
argc
argv
,这会导致编译器输出2条警告消息。建议使用签名:
int main(void)
char truefalse; // Make it an object instead of a pointer.
char endmessage[]="Continue: [y/n]\n";
write (STDOUT_FILENO, endmessage, strlen(endmessage));
read (STDIN_FILENO, &truefalse, 1); // Use the address of the variable.
int c;
while ((c = fgetc(stdin)) != EOF && c != '\n');