c - C 中的多重条件检查

标签 c linux bash unix sh

我制作了一个 shell 脚本来备份、查看和恢复 Linux 系统中已安装的软件包。该脚本如下所示:

#!bin/bash

echo ""
read -p "You are about to backup installed packages. Continue (y/n)?:" CONT
echo ""
if [ "$CONT" = "y" ]; then
  eval sudo pacman -Qqe | grep -vx "$(pacman -Qqm)" > packages;
else
  echo "Ok. I got you, I won't backup";
fi

    read -p "View list? (y/n):?" CONT
if [ "$CONT" = "y" ]; then
    eval xargs -a packages ;
else
    echo "Preparing to restore"
fi
echo ""
read -p "So restore list contents (y/n):?" CONT
echo ""
if [ "$CONT" = "y" ]; then
    eval sudo xargs -a packages pacman -S --needed ;
else
    echo "Ok. No packages restored!";
fi

该脚本创建一个文本文件,其中包含系统中安装的所有软件包名称,然后提示用户查看列表,最后允许他恢复备份列表中包含的软件包。 然后,我决定使用 C 来做同样的事情。我创建了一个如下所示的程序:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main() {
char ans[2];
char command[100];
printf("\nYou are about to backup installed packages. Continue (Y/N)?:");
scanf("%1s", ans);
if (strcmp(ans, "Y")==0) {
    strcpy(command, "sudo pacman -Qqe | grep -vx '$(pacman -Qqm)' > packages");
    system(command);
    printf("\nBackup done! \n");
  }
else {
    printf ("\nGot you, I won't backup \n");
  }
}

但是这段代码只能给用户一个选择是否要备份列表的选择。由于 while 循环,如果我尝试在现有 while 循环中添加另一个条件,就会陷入陷阱。

我在这些问题上需要一些帮助才能完成以下条件。 如何为用户提供其他选择,例如:

1) 查看备份列表? 2) 恢复备份列表中包含的包?

举个例子会很有帮助:))

最佳答案

正确的应该是

if(scanf("%1s",ans)!=1){
   // error handle
}

这将使您在 strcmp 函数中正确使用它。

或者你可以这样做

if(scanf("%c",&ans[0])!=1){
   // error handle
}
ans[1]=0;

然后你可以在strcmp中使用它或者简单地使用

if(ans[0]=='Y'){
   ...
}

通过检查scanf的返回值来了解scanf调用是否成功。

还可以使用 sprintf 或类似的方法代替 strcpy,这样就不会遇到缓冲区溢出的情况。在这里您知道长度,但在许多情况下您不会 - 那么使用 sprintf 是很好而且安全的。

如果您在编译器中启用警告,那么您将看到类型不匹配警告。类似的东西

format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[2]' [-Wformat=]
     scanf("%s",&ans);
     ^

尝试在启用 -Wall -Werror 标志的情况下编译代码。

关于c - C 中的多重条件检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47978025/

相关文章:

linux - 用于删除小于 x kb 的文件的 Shell 脚本

linux - 如果比较特定字符串时条件不匹配,则 Bash

bash - 从 bash 命令的命令输出在 Ansible 中设置环境变量

bash - 将 xargs 的输出重定向到文件

c - 如何为 EtherCAT 主站实现字符设备的用户空间实现?

linux - Zend Framework 2 中公用文件夹的最佳设置是什么?

c - 从抽象语法树评估表达式

linux - 如何检查FTP匿名连接

c - 来自 recvfrom 的以太网 header 与预期不符

c++ - Qt 拆分 QString