【问题标题】:What do I check for in this if statement?我在这个 if 语句中检查什么?
【发布时间】:2021-11-19 04:48:52
【问题描述】:

我正在使用 sscanf 读取用户输入并保存到多个输出。据我了解,如果我有 sscanf(iput, %s %s %s %s, arr[0], arr[1], arr[2], arr[3]) 我最多可以有 4 个项目输入,但不需要 4;这意味着我可以只放两个,而 arr[2] ad arr[3] 将没有任何价值。但是,我认为我不理解某些东西,因为后来当我检查 arr[2]/arr[3] 的值时,它们不为空,当时我认为字符串只是用 \0 初始化的。请看一下我的代码,告诉我我猜 if 语句应该检查什么。

printf("Enter a command: ");
        char input[20];
        char line[5][20];
        fgets(input, 20, stdin);
        sscanf(input, "%s %s %s %s %s", line[0], line[1], line[2], line[3], line[4]);
....

else {
            int status;
            if(line[4] != NULL) {
                char *args[6];
                args[0] = line[0];
                args[1] = line[1];  
                args[2] = line[2];
                args[3] = line[3];
                args[4] = line[4]; 
                args[5] = NULL;
            if ( fork() == 0 ) {
                execv( args[0], args ); // child: call execv with the path and the args
            }
            else {
                wait( &status );  
            }    

【问题讨论】:

  • 请发帖minimal reproducible example。由于潜在的缓冲区溢出,scanf 的使用不安全。请改用fgets()
  • 另外,我认为您的代码甚至无法编译。 scanf("%s ..." 需要一个 char * 但你传递给它一个 char (line[0])。
  • 如果你只在格式字符串中传递了两个百分号,那么 scanf 认为你只传递了两个变量。如果它不知道最后两个它不会用任何东西填充它们 - 甚至不是 NULL。但这还不是全部:如果您声明char line[5][20];,那么 line[x] 将始终有一个值并且永远不会为 NULL,因为您实际上已经分配了该内存。如果您希望其中一些为 NULL,则需要将其声明为 char *line[5] = {0};,然后为您希望为非 NULL 的所有指针分配内存。
  • if(line[4] != NULL) 这不可能是真的。 line[4] 是一个永远不会衰减为 NULL 指针的数组。

标签: c scanf execv


【解决方案1】:

scanf 将尝试获取您所要求的一切。你要五个,它试图得到五个。

sscanf(input, "%19s %19s %19s %19s %19s", line[0], line[1], line[2], line[3], line[4]);

如果没有规范,它将占用用户倾向于提交的尽可能多的字符,从而导致缓冲区溢出。坏主意。

我会一次接受一个论点,或者把它当作一个整体。

【讨论】:

    【解决方案2】:

    使用 Jerry Jeremiah 所说的注释,我没有将声明更改为指针,而是将 if 语句中的 line[x] 更改为指针并检查 NULL。

    【讨论】:

      猜你喜欢
      • 2018-03-02
      • 1970-01-01
      • 2012-08-09
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多