【问题标题】:if statement on char array in CC中关于char数组的if语句
【发布时间】:2014-01-02 04:09:25
【问题描述】:

我有这个语法。 我对第二个功能有疑问(validateGuess) 这个函数应该检查用户向程序介绍的字符。 我做了一个函数,如果不是 0-9 之间的字母(在 main 上),再次向用户询问一个字母。 但是如果放一封信,程序会要求用户再写一次。 但是如果我输入一个像 22 这样的数字,程序不会再次向用户询问它,因为我不知道如何将输入限制为 1 位。 重要的是要说我的老师要求我们制作了一个 char 数组而不是 int 数组。 我需要 if 语句只在函数中检查它。如果返回1是合法数字,如果是返回0是非法的,应该重新写。

语法如下:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
void GenerateCode(char code[SIZE]);
int validateGuess(char guess[]);

void main ()
{
    int i;
    char code[SIZE]={0};
    char input[SIZE]={0};
    GenerateCode(code);
    printf("Write your guess please\n");
    for(i=0;i<SIZE-1;i++)
    {
    scanf("%s",&input[i]);
    if(validateGuess(&input[i])==0)
        {
            printf("Wrong input, put a number between 0 to 9\n");
            i--;
        }
    }

    system("pause");
}

void GenerateCode(char code[SIZE])
{
    int i;
    for(i=0;i<SIZE;i++)
    {
        code[i]=rand()%10;
    }
}

int validateGuess(char guess[])
{
    int validateGuess=0;
    if((guess[0]>=49) && (guess[0]<=57))
        validateGuess=1;

    return validateGuess;
}

【问题讨论】:

  • 这是 C 还是 C++?你也可以添加那个标签吗?
  • scanf("%s",&amp;input[i]); 不会像您认为的那样做。阅读scanf() 的文档,然后停止使用它。改用合理且实际有用的函数,例如getchar()fgets()
  • if((guess[0]&gt;='0') &amp;&amp; (guess[0]&lt;='9') &amp;&amp; guess[1] == '\0'),正如H2CO3所说,这个scanf有问题。

标签: c arrays function syntax char


【解决方案1】:

你不能限制用户的输入,至少不能这样。但是你可以使用 getline 函数从你的流(我猜是标准输入)中读取一行,并使用 strlen 检查它的长度。如果输入的大小不合适,请再次请求输入,直到获得所需的内容。

【讨论】:

    【解决方案2】:

    我不会提供完整的解决方案,但是我想指出您的代码中有几个错误,以便您可以逐步解决此问题:

    • 数组初始化 char code[SIZE]={0}; 是多余的,因为声明 char code[SIZE]; 将声明一个包含 SIZE 元素的数组 - 无论如何都设置为 0

    • 调用scanf("%s", &amp;input[i]); 告诉scanf 读取字符串并将该字符串放入char 数组位置。你想在这里读取一个char,代表一个数字,所以使用%c而不是%s。这将截断用户提供的所有输入,除了第一个字符。所以输入33会存储3,输入123会存储1等等。

    • 这个测试if(validateGuess(&amp;input[i])==0)input[i]地址 传递给validateGuess,而不是input[i]内容。要传递您不使用一元 &amp; 运算符的内容。

    • validateGuess() 的签名更改为validateGuess(char guess),并更改其主体以将guess 视为代表数字的单个字符。由于您只期望从09 的数字,因此您也不能猜测等于4957 或任何其他两位或多位数字的值。应该在您的程序中更改该逻辑。

    要获取代表单个数字的字符的数值,您可以使用以下函数:

    int num(char c) {
        return c - '0';
    }
    

    字符与整数值的比较如下所示:

    if (num(c) == 2) {
        /* c is the digit 2 */
    }
    

    希望这会有所帮助。

    【讨论】:

    • 嗨,如果我将 SIZE-1 更改为 SIZE 是编译错误,因为我创建了一个大小为 5 的数组来引入 4 个字符(最后一个位置是 \0)所以我引入直到字符数为 4也就是说直到位置 0,1,2, -- 3 -- 位置 4 是 \0),如果我删除 & 是编译错误,我如何比较内容?
    • @user3077648 好的,请参阅更新。我的陈述中有一些错误。
    • 在块范围内声明 char code[SIZE]; 将声明一个 SIZE 元素数组 - 无论如何都设置为 0 是错误的。 C 标准:如果具有自动存储持续时间的对象没有显式初始化,则其值是不确定的。
    猜你喜欢
    • 1970-01-01
    • 2015-07-24
    • 2014-10-15
    • 2013-07-12
    • 2013-05-29
    • 2016-07-14
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多