如何正确传递单个char作为C中另一个方法的引用

时间:2013-12-09 23:52:45

标签: c string pass-by-reference arrays

好的,我一直试图破解这个问题一段时间了。我很确定我缺乏关于字符串和字符如何在C中工作的某种基本知识。

我有一种方法,我可以在跳棋板上获取移动的坐标。因此,用户应输入A1,B2以表示他们想要从方形A1移动到B2。它看起来像这样:

void get_desired_move(void)
{
    char    Ocol,
            Orow,
            Dcol,
            Drow,
            format;

    char move[7];

    printf("Please enter your next move (Origin Coordinate, Destination Coordinate): ");
    gets(move);

    endl(); // method I wrote for line break

    sscanf(move, "%c%c%c %c%c", &Ocol, &Orow, &format, &Drow, &Dcol);


    if(format == ',')
        validate_input(&Ocol, &Orow);

}

然后validate_input():

int validate_input(char *col, char *row)
{
    int colInt = *col-0x041;
    int isDig = isValidDigit(row);
    int rowInt = atoi(row);
    if(rowInt >=1 && rowInt <=8 && colInt >= 1 && colInt <= 8)
    {
        if(atoi(row) > 0 && atoi(row) < 8)
        {
            return true;
        }
}

当来自get_desired_move()的Orow被传递到validate_input中的*行时,它会添加从Ocol传递给它的任何字母。所以在调试器中我可以看到

Dcol    char    '2'
Drow    char    'B'
format  char    ','
move    char [7]    
Ocol    char    'A'
Orow    char    '1'

一旦我到达validate_data()突然排了:

row char *  0xbffff20a "1A"
col char *  0xbffff20b "A"
colInt  int -1073745399

为什么A被添加到我的1?是因为我没有char指针行的空终止符吗?如果是这样,我该如何解决这个问题呢? isValidDigit是我拥有的循环char数组的方法,因为添加了“A”它失败了......不要太提及它让我疯狂,我无法理解发生了什么。感谢大家。

编辑


好的,在帮助之后(感谢!)我对C中传递的东西有了更好的了解,并且还意识到我有更多需要学习的东西。无论哪种方式,我修改后的validate_input方法现在看起来像这样:

bool validate_input(char row, char col)
{
    if(&& atoi(&row) >=1 && atoi(&row) <=8 && col >= 'A' && col <= 'H')
    {
            return true;
    }
    else return false;
}

@ Bit Fiddling Code Monkey谢谢!

1 个答案:

答案 0 :(得分:1)

你非常复杂的事情。这将解决问题(假设您已正确扫描stdin输入):

// Rows: 1 to 8
// Cols: A to H

bool validate_input(char col, char row)
{
    if((col >= 'A') && (col <= 'H') && (row >= '1') && (row <= '8'))
        return true;
    else
        return false;
}

注意:

  1. 我回来了一个布尔。它只能是真或假。
  2. 我传递的是col和row的值,而不是地址。它只有一个字符,因此不需要地址。