比较2D数组中的元素

时间:2014-08-21 14:54:10

标签: c arrays

我正在尝试将从文本文件中输入的元素与我的2D数组进行比较。文本文件的示例如下:

ABCDE
FGHIK
LMNOP

我知道我可以在文件中读得很好,也可以打印每个元素。

我正在尝试将每个角色与下一个角色进行比较。在我的脑海中,这是它的工作原理: 如果它们匹配,则转到下一个char,然后将该char与下一个char进行比较。如果它们不匹配,则将“错误”打印到终端并中断switch语句。虽然当我在我的程序中运行它时,它只打印出“这是否被这种情况所困扰?” “确实是”。对我可能做错的任何帮助都会非常有帮助。

void match_char(char** array, int height, int width){
    int a, i, j;
    printf("Is this being accessed?");
    a = 0;
    i = 0;
    j = 0;
    switch(a){
        case 1: if(a <1 ){
            for(j = 0; j < width; j++){
                if (array[i][j] != array[i][j+1]){
                    printf("error\n");
                    break;
                } else if(j == width) {
                    a=1;
                    break;
                }
            }
        }/* End of case 1*/
        case 2: if (a > 0 && a < 2){
            for(i = 0; i < height; i++){
                if (array[i][j] != array[i+1][j]){
                    printf("error\n");
                    break;
                }else if(i == height) {
                    printf("No error");
                    a=2;
                    break;
                }
            }
        }/* End of case 2 */
        case 3: 
            if (a > 2) {
                a=0;
                break;
            }
    }/*End of switch */

    printf("It sure is");

}

2 个答案:

答案 0 :(得分:3)

案例意味着什么

为了清楚起见,在case X中,X不是该案例的标签,而是检查Y中的switch(Y)是否等于X

为了帮助实现这一点,我们将交换机重写为if... else语句。

a = 0; 
if(a == 1){ //  == case 1
    // stuff
} else if(a == 2){ // == case 2
    // stuff
} else { // == default
...

现在if中的switch语句与case是否已执行无关。


Switch如何工作

现在,让我们谈谈switch的工作原理。编译代码时,根据每个case的值范围,生成跳转表或与if... else if... else语句几乎相同的内容。无论如何,您有一份说明清单。伪装配看起来像这样:

instruction n : multiply the value of a by some offset and jump to a*offset + n
n +a*offset_1 : do stuff 
                jump to m // break
n +a*offset_2 : do stuff
                jump to m // break
n +a*offset_3 : do stuff
                jump to m // break
n +a*offset_4 : do stuff
                jump to m // break
instruction m : do more stuff

如果你休假,

instruction n : multiply the value of a by some offset and jump to a*offset + n
n +a*offset_1 : do stuff 
n +a*offset_2 : do stuff
n +a*offset_3 : do stuff
n +a*offset_4 : do stuff
instruction m : do more stuff

因此,您可以看到为什么break阻止其他案例被执行 - 并且将它们排除在案例之后以及每个案例执行之后,无论您是否符合{{1条件。

答案 1 :(得分:1)

在第一个案例标签中,您询问是否&lt;用== 1到达那里后1,所以if总是假的。

在第二种情况下,a == 2,所以它不能等于1(if检查&gt; 0和&lt; 2,所以它只能等于1才能进入if)< / p>

在第三种情况下,你要求&gt; 2(总是,当你在= = 3时到达那里)所以必须正确地重新定义所有if条件。

我想你知道你初始化a = 0并且没有a的值,所以你只是在不输入任何情况下跳过开关。

你也没有用过休息;句子,我想故意,但因为你没有任何== 0的情况,你永远不会进入任何转换案例。