在char数组中搜索char

时间:2013-08-08 03:28:14

标签: c loops comparison

我一直在尝试迭代预定的字符数组,并将其与单个字符中的扫描进行比较。如果扫描的char在数组中,我想将它添加到2d数组中,如果它不在数组中我想要错误处理。

我的代码目前正在

    char c;
    char legalChar[] = "./\\=@ABCDEFGHIJKLMNOPQRSTUVWXYZ\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 */
    }

但这不起作用,因为它只是在每次迭代时跳转到这个if语句。

目前程序的输出是colCount被赋值为1而rowCount保持为0.所有迭代的字符都在legalChar []数组中,所以我不确定我做错了什么。 / p>

非常感谢任何建议。

由于

3 个答案:

答案 0 :(得分:1)

你的问题是if (c != legalChar[i])几乎总是如此。假设输入的字符为M,显然位于legalChar。如果您选中c != legalChar[i],那么您第一次检查c != '.',这显然是正确的。

处理此问题的更好方法是使标志值开始为false,如果找到某些内容则设置为true。完成循环后,如果标志仍为false,则表示未找到该值。

此外,您应该在每次循环时重置i,并且for循环比while循环更有意义,尤其是在您使用{{1}时因为c99可以在循环中声明..

i

答案 1 :(得分:1)

在这里,我做了一点测试,我的代码工作得很好,也许你可以试试:

#include "stdio.h"
  2 int main()                                                                                                                                              
  3 {
  4     char c;
  5     char legalChar[33] = "./\\=@ABCDEFGHIJKLMNOPQRSTUVWXYZ\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 } 

答案 2 :(得分:1)

我认为您可以使用strchr简化此代码:

    char c;
    char legalChar[] = "./\\=@ABCDEFGHIJKLMNOPQRSTUVWXYZ\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
        }
    }

一旦找到无效字符,上述内容将中止循环。如果您不想这样做,只需删除对“legal”变量的所有引用。