在C中输入消毒

时间:2015-02-09 16:04:45

标签: c

#include <stdio.h>

int main() {
    char name [20];
    char command [100];
    printf("What is your name?\n");
    scanf("%19[^\n]s", &name);
    sprintf(command, "echo Hello %s; echo The time is currently:; date", name);
    system(command);
}

然后将此代码修改为以下内容:

#define IS_VALID 1
#define NOT_VALID 0
#include <stdio.h>
#include <string.h>

int main() {
    char name [20];
    char command [100];
    printf("What is your name?\n");
    scanf("%19[^\n]s", &name);
    if(validate(name) == IS_VALID) {
        sprintf(command, "echo Hello %s; echo The time is currently:;"
        "date", name);
        system(command);
    } else
        printf("Invalid input!\n");
}

int validate(char* input) {
    for(int i=0; i < strlen(input); i++)
        if(!isalpha(input[i]))
            return NOT_VALID;
    return IS_VALID;
}

现在我需要做的是再次修改代码以便安全使用并打印名称输入,即使用户输入无效字符,例如用户输入; / etc / passwd这将更改为etcpasswd或者无效的字符被替换为 - 所以它将被更改为--etc-passwd。有谁知道怎么做?

2 个答案:

答案 0 :(得分:0)

#include <stdio.h>
#include <string.h>
#include <ctype.h> //for using isdigit()

int main() {
    char name [20];
    char command [100];
    printf("What is your name?\n");
    scanf("%19[^\n]", name); //explained below
    validate(name);
    sprintf(command, "echo Hello %s; echo The time is currently:; date", name);
    system(command);
    return EXIT_SUCCESS;
}

void validate(char* input) {
    for(int i=0; i < strlen(input); i++)
        if(input[i] && !isalpha(input[i])) //if current character is not 0(NUL) and is not an alphabet
            input[i]='-'; //replace current character with a hyphen
}

scanf("%19[^\n]s", &name);

在你的所有例子中都应该是

scanf("%19[^\n]", name);

&不需要作为数组的名称&#34;衰变&#34;指向其第一个元素(char*)的指针,s不是%[格式说明符的一部分。见this

答案 1 :(得分:0)

我错过了你想要用连字符替换的无效字符。此代码将删除它们。

在代码中添加另一个char数组声明,如下所示:

char cleanedCommand [100] = {0};

将cleaningCommand数组的地址传递给验证函数:

if(validate(name,cleanedCommand) == IS_VALID) {

更改validate函数的声明以接受新参数

int validate(char* input, char* output) {

在validate函数中,在现有的if语句中添加else子句,将input [i]复制到output [i]。

更改您的sprintf()和system()调用以使用cleaningCommand。