我一直在尝试迭代预定的字符数组,并将其与单个字符中的扫描进行比较。如果扫描的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>
非常感谢任何建议。
由于
答案 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”变量的所有引用。