基于Unix的操作系统:编码错误

时间:2018-02-09 08:19:01

标签: c unix

我正在尝试构建一个类似echo的命令,我在xv6命名为code。问题是如果:

输入:

$code Hello World

输出:

user space:Hello user space:World

正确的输出应该是:

user space: Hello World

有人能帮助我吗?

int
main(int argc, char *argv[])
{
  int  i;

  if(argc <= 1){
    printf(1," %s user space:", argv[0]);
    exit();
  }

  for(i = 1; i < argc; i++){
    printf(1, " print in user space:%s",argv[i]);
  }
  printf(1, "\n");
  exit();
}

3 个答案:

答案 0 :(得分:0)

程序名也作为参数传递给你的main函数,所以你在这里有三个(作为hello和world被认为是单独的参数)参数。你的代码中有几个问题,因为如果语句为false,你首先有两个参数,并且您没有在for循环中正确打印,以下可能会有所帮助:

int  main(int argc, char *argv[])
{
  int  i;
  printf("number of arguments : %d ",argc);
  //argv array index count from 0
  for(i = 0; i < argc; i++){
    printf("argument number %d : %s",i,argv[i]); // issue in your code 
  }
  printf("\n");//issue in your code
  exit(0);
}

答案 1 :(得分:0)

可以使用write命令,以便输出到stdout。在每个命令行参数之间需要写入一个额外的空格。

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[]) {

  int i;

  write(1, "user space: ", 12);

  for (i = 1; i < argc; i++) {
    size_t len = strlen(argv[i]);
    write(1, argv[i], len);
    write(1, " ", 1);
  }

  write(1, "\n", 1);

  return 0;

}

答案 2 :(得分:0)

代码中有问题的部分在这里:

for(i = 1; i < argc; i++){
 printf(1, " print in user space:%s",argv[i]);   //" print in user space:" is printed
                                                 //for each iteration
}

正如其他人指出的那样,你应该做:

printf(" print in user space:\n");
for(i = 1; i < argc; i++){
   printf("%s",argv[i]);
}

那就是说了几句话:

  • 我从未见过一个以整数作为第一个参数的printf,我假设第一个参数不重要/是一个错字

  • 我不是专家unix开发人员,但您可以使用“return 0”(或“return 1”)退出程序。您也可以通过这种方式返回错误代码,就像大多数unix程序一样

  • 如果您决定使用printf,请注意它为恶意用户提供了一个令人讨厌的安全漏洞which can expose the caller's stack。确保您的输入格式正确或尽可能使用其他功能