2013-08-08 3 views
0

Я пытаюсь выполнить итерацию через заданный массив символов и сравнить его с отсканированным в одиночном символе. Если отсканированный символ находится в массиве, я хочу добавить его в массив 2d, если он не находится в массиве, я хочу обработать ошибку.Поиск массива char для char

Мой код в настоящее время

char c; 
    char legalChar[] = "./\\[email protected]\n"; 
    int rowCount = 0; 
    int colCOunt = 0; 
    int i = 0; 
    FILE * map; 

    while (c = fgetc(map), c != EOF) { 
     while (i < (sizeof(legalChar))){ 
      if (c == legalChar[i]){ 
       if (c == '\n'){ 
        /*Add 1 to number of rows and start counting columns again */ 
        rowCount++; 
        colCount = 0; 
       } 
       else { 
        /*would have code to add char to 2d array here */ 
        colCount++; 
       } 
      } 
     i++; 
    } 

Я планировал иметь

if (c != legalChar[i]){ 
     /*Error handling */ 
    } 

, но это не работает, потому что он просто прыгает в это, если заявление на каждой итерации.

Вывод программы в настоящий момент определяется colCount 1 и rowCount остается равным 0. Все символы, которые повторяются, находятся внутри массива legalChar [], поэтому я не уверен, что я делаю неправильно.

Любые советы были бы весьма полезными.

Благодаря

+0

'EOF' никогда не совпадает с символом' char', а '' '' 'вместо' int'. –

+2

Вы можете использовать 'if (strchr (legalChar, c)) {/ * char является законным * /} else {/ * char не является законным * /}' для проверки символа без написания цикла самостоятельно. – caf

+1

Вы пытались скомпилировать свой код? : 'ошибка C2065: 'colCount': необъявленный идентификатор' Ошибка с неправильным именем переменной. – boleto

ответ

1

Ваша проблема заключается в том, что if (c != legalChar[i]) почти всегда верно. Скажем, что введенный символ M, который явно находится в legalChar. Если вы проверите, что c != legalChar[i], вы проверяете это c != '.' в первый раз, что, безусловно, верно.

Лучшим способом справиться с этим является наличие значения флага, которое начинается с false, и имеет значение true, если вы что-то нашли. Как только вы закончите цикл, если флаг по-прежнему ложный, то вы знаете, что значение не было найдено.

Кроме того, вы должны сбросить i каждый раз, когда вы идете через петлю, и for петля имеет больше смысла, чем while петли, особенно если вы используете c99 как i может быть объявлена ​​внутри цикла ..

int c; 
char legalChar[] = "./\\[email protected]\n"; 
int rowCount = 0; 
int colCOunt = 0; 
int i = 0; 
int found = 0; 
FILE * map; 

while (c = fgetc(map), c != EOF) { 
    found = 0; 
    for (i = 0; i < sizeof(legalChar); i++){ 
     if (c == legalChar[i]){ 
      if (c == '\n'){ 
       /*Add 1 to number of rows and start counting columns again */ 
       rowCount++; 
       colCount = 0; 
      } 
      else { 
       /*would have code to add char to 2d array here */ 
       colCount++; 
      } 
      found = 1; 
      // break out of loop here? 
     } 
    } 
    if (!found) { 
     // Error handling here 
    } 
} 
+0

То же самое для вас: 'EOF' никогда не совпадает с символом' char', а 'c' вместо' int'. –

+0

Пропустил это в первый раз, спасибо. –

+0

Спасибо за это. Я просто не мог понять, как правильно выйти из цикла, когда обнаружил незаконный символ с моим исходным кодом. Прекрасно работает! – user2662961

1

Здесь я немного теста и мой код работу хорошо, может быть, вы можете попробовать:

#include "stdio.h" 
    2 int main()                                    
    3 { 
    4  char c; 
    5  char legalChar[33] = "./\\[email protected]\n"; 
    6  int rowCount = 0; 
    7  int colCount = 0; 
    8  int i = 0; 
    9  FILE * map; 
10  if(NULL ==(map = fopen("error.txt","r"))) 
11    return -1; 
12  int is_ok; 
13  while (!feof(map)) 
14  { 
15   c = fgetc(map); 
16   i = 0; 
17   is_ok = 0; 
18   while (i < (sizeof(legalChar))) 
19   { 
20    if (c == legalChar[i]) 
21    { 
22     if(c == '\n') 
23     { 
24      rowCount++; 
25      colCount = 0; 
26     } 
27     else 
28     { 
29      colCount++; 
30     } 
31     is_ok = 1; 
32    } 
33    else 
34    { 
35     if(i == 31&&is_ok == 0)// not the char in legalChar 
36     { 
37      printf("This char %c is ilegal in %d ,%d \n",c,rowCount,colCount); 
38      colCount++; 
39     } 
40    } 
41    ++i; 
42   } 
43  } 
44  return 0; 
45 } 
+0

Зачем проверять 'if (i == 31 && is_ok == 0)' каждый цикл? –

+0

@MattBryant Чтобы узнать, находится ли c в legalChar [33] или нет. –

1

Я думаю, вы можете упростить этот код с помощью strchr:

char c; 
    char legalChar[] = "./\\[email protected]\n"; 
    FILE * map; 
    int legal = 1; 

    while (c = fgetc(map) && c != EOF && 1 == legal) { 
     if (NULL == strchr(legalChar, c)) { 
      legal = 0; 
      // Error message pointing out invalid character 
     } 
     else { 
      // Add to array 
     } 
    } 

Вышеуказанное отменяет цикл после обнаружения недопустимого символа. Если вы не хотите этого делать, просто удалите все ссылки на «законную» переменную.

+0

Я изначально пытался использовать strchr, но при компиляции я получил бы ошибку, предполагающую, что у меня не было #include , хотя у меня это было в моем коде. Поэтому я решил написать свой собственный код для этого. Спасибо за помощь, хотя :) – user2662961

Смежные вопросы