【发布时间】:2020-11-24 15:05:11
【问题描述】:
我创建了一个函数,用于计算 2D 字符数组中唯一字符的数量,该函数根据唯一字符的数量是高于还是低于网格的宽度或高度来返回真/假。
我想知道是否有更简单的方法在 c90 中实现 uniqueChars 函数。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#define MAXGRIDHW 9
typedef enum bool{ false = 0, true = 1 } bool;
typedef struct node{
char grid[MAXGRIDHW][MAXGRIDHW];
int height;
int width;
int parent;
} Node;
bool uniqueChars(Node* b);
void setHeightWidth(Node* b, int h, int w);
void clearNode(Node* b);
int main (void)
{
Node shelf1[10];
char testArr2[3][4] = {{"z.."},
{"q.."},
{"z.."}};
clearNode(&shelf1[2]);
memcpy(&shelf1[2].grid, testArr2, 7);
setHeightWidth(&shelf1[2], 3, 4);
assert(uniqueChars(&shelf1[2]) == true);
return 0;
}
bool uniqueChars(Node* b)
{
int i, j, chars = 0;
bool appears;
for (i = 0; i < MAXGRIDHW; i++) {
for (j = 0; j < MAXGRIDHW; j++) {
b->grid[i][j] = toupper(b->grid[i][j]);
if (b->grid[j] == b->grid[i]) {
appears = true;
break;
}
}
if (!appears) {
chars++;
}
}
if (b->height < chars || b->width < chars) {
return false;
}
return true;
}
void setHeightWidth(Node* b, int h, int w)
{
b->height = h;
b->width = w;
}
【问题讨论】:
-
您的
uniqueChars是错误的,因为 1. 条件b->grid[j] == b->grid[i]是比较指针。在第一次迭代时总是如此i = 0, j = 0,因此毫无意义。 2.appears的值可以在修复后不用初始化就可以使用。未初始化的非静态局部变量的值是不确定的,使用这些值会调用未定义的行为。 -
我该如何解决问题 1? j = i + 1?
-
uniqueChars真的应该使用toupper()修改网格的内容吗?uniqueChars不应该使用网格的设置高度和宽度,而不是最大高度和宽度吗? -
我打算稍后将
toupper()移动到另一个函数,我只想要相同字母的实例,只是大写和小写,被视为 1。是的,现在我应该使用我实际设置的高度/宽度