【问题标题】:C system call I/O and sscanf practiceC系统调用I/O和sscanf实践
【发布时间】:2017-08-18 19:57:42
【问题描述】:

我正在尝试编写一个使用系统调用(readwrite)获取输入和输出的 C 程序。但是,我也想使用sscanf 进行转换。程序将输入一个开始值和结束值,并将计数到该结束值。我正在尝试使用sscanf 进行转换。

int main(int argc, char **argv){                                                
    char beg[5];                                                                
    char stop[5];                                                               
    int i, start, end;                                                          

    write(1, "Starting value: ", 16);                                           
    read(0, beg, 4);                                                            
    sscanf(beg,"%d",&start);                                                    

    write(1, "Ending value: ", 14);                                             
    read(0, stop, 4);                                                           
    sscanf(stop,"%d",&end);                                                     


    int dif = end - start;                                                      
    if (dif >= 0){                                                              
        for (i = start; i <= end; i++){                                         
            write(1, &i, sizeof(i));                                            
        }                                                                       
        write(1, "\n", 1);                                                      
    }                                                                           
    return 0;
}

期望的输出:

Starting value: 1
Ending value: 4
1 2 3 4

但是,计数不会打印任何内容(如果我使用 printf("%d ", i);,它会起作用)

【问题讨论】:

  • read(0, beg, 4); beg 不是以 NUL 结尾的。 [缓冲您的输入]

标签: c io system-calls scanf


【解决方案1】:

你有这个:

int i;
write(1, &i, sizeof(i));

我猜你认为这相当于:

printf("%d", i);

但事实并非如此!

printf() 会将其参数格式化 为人类可读的ASCII 文本,write() 不会这样做。相反,它将原始字节作为二进制、机器可读的数据直接写入文件中。

只需使用printf()

至于这个:

write(1, "Starting value: ", 16);

那是糟糕的代码。而是:

puts("Starting value: ");

【讨论】:

  • @Jakeeln:为什么?是不是你在做学校作业,不允许使用printf()?如果是这样,您应该在问题中提及这一点。
  • 不,不是为了学校,我的意思是发帖的原因是为了更好地理解系统调用的使用。
  • 我想一个具体的问题,你会如何更改write(1, &amp;i, sizeof(i)); 来打印值?
  • @Jakeeln:为此,您首先需要将整数转换为字符串,然后再将其转换为write()。至于第一步怎么做,这里有介绍:stackoverflow.com/questions/8257714/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多