期望C中的特定数据类型

时间:2016-03-01 22:49:23

标签: c

我试图完成一部分程序,但我似乎无法理解如何完成一个简单的问题。为了让用户到达程序的下一部分,他们需要输入一个char,decimal和hex值。如果他们没有控制切换到另一个功能。

我希望它会像

一样简单
if(input != "%c %d %x") etc.
从我读到的内容看起来似乎比这更令人困惑,我似乎无法找到答案,尽管我确信我忽略了一个明显的答案。

编辑:

int main() {
    char input[512];
    int n;
    user_id = (char *)malloc(100);

    printf("Type your user id\n");
    my_fgets(user_id, 100, stdin);
    printf("Input for phase 1\n");
    my_fgets(input, 512, stdin);
    phase_1(input);
    n = hash2(user_id);
    printf("Your number is %d\n", n);
}
void phase_2(char *input, int n)
{
    n = n + 100;
    if(input != "%c\n")
        explode_bomb();
}

3 个答案:

答案 0 :(得分:0)

您需要编写一个输入函数,将输入读入字符串,然后使用isdigit()ischar()isxchar()扫描字符串以找出输入所在的 type 。 / p>

答案 1 :(得分:0)

我假设你期望input是这样的:C 67 43。字符C及其十进制和十六进制值。您需要编写一个函数来解析此字符串并确定它是否正确。

首先,解析。你走在正确的轨道上。你需要的是sscanf

char char_char;
unsigned int char_hex;
unsigned int char_int;

if( sscanf(input, "%c %u %x", &char_char, &char_int, &char_hex) < 3 ) {
    fprintf(stderr, "%s doesn't look like what I want\n", input);
    return false;
}

我选择unsigned int因为%x映射到无符号整数,char也可以安全地与无符号整数进行比较。

然后你需要做的就是检查三个值是否相同。 sscanf已将十六进制转换为无符号整数,char可以安全地与无符号整数进行比较。

if( char_int != char_hex ) {
    fprintf(stderr, "%u and %u don't match\n", char_int, char_hex);
    return false;
}

if( char_int != char_char ) {
    fprintf(stderr, "%u and %c don't match\n", char_int, char_char);
    return false;
}

return true;

将它们放在一起并围绕它包装一个函数。

#include <stdbool.h>
#include <stdio.h>

bool check_input(const char *input) {
    char char_char;
    unsigned int char_int;
    unsigned int char_hex;

    if( sscanf(input, "%c %d %x", &char_char, &char_int, &char_hex) < 3 ) {
        fprintf(stderr, "%s doesn't look like what I want\n", input);
        return false;
    }

    if( char_int != char_hex ) {
        fprintf(stderr, "%u and %u don't match\n", char_int, char_hex);
        return false;
    }

    if( char_int != char_char ) {
        fprintf(stderr, "%u and %c don't match\n", char_int, char_char);
        return false;
    }

    return true;
}

更好的函数不会打印到stderr,而是通过传入char *来设置错误消息。

答案 2 :(得分:0)

为了测试字符串是否符合给定格式,请使用"*""%n"

*仍会扫描与说明符匹配的文本,但会禁止保存,也不会添加到返回值。

"%n"指示*scanf()保存到目前为止已扫描的char个数。

通过测试n > 0是否input[n]是字符串的结尾,代码可以简单地检测匹配的格式。

int n = 0;
sscanf(input, "%*c %*d %*x %n", &n);
if (n > 0 && input[n] == '\0') {
  puts("Success");
}