我所做的是要求用户输入程序循环的次数,然后将值记录到3个不同的数组中。一切都很好,但我需要它做的是打印一个数组的元素,如果另一个数组中的相应元素满足要求。其他一切都运行得很好,我将发布我试图用于此的两个阵列。
char *names[50][32];
char *states[50][2];
i = 0;
while ( i < b) {
if (state[i] = "tx");{
printf("a string %s\n", names[i]);}
i = i + 1;
}
为此:if (state[i] = "tx");{
我尝试使用和不使用引号并使用116120 ...
基本上,它要求人们的名字和他们居住的地方。我可以让它打印每个名称的数组元素值(它在一个循环中运行)但我希望它只打印生活在tx中的人的名字。
答案 0 :(得分:3)
您的代码存在一些问题。首先使用分号结束if
或for
构造是从C开始时常见的错误。基本上它会创建一个空的if
语句,后跟一个代码块。以这种方式看待它:
if (condition)
; // Does nothing. The if is empty
// Totally unrelated block of code.
{
}
代码块通常对创建范围很有用,所以尽管编译器以这种方式解释块似乎没用,但实际上并非如此。在其他情况下也会发生这种情况,例如while
,for
等等:
for (int i=0 ; i<n ; ++i)
; // Empty for. Runs `n` loops, but doing nothing
// Unrelated block of code. Runs only once
{
}
比较运算符也是错误的,您应该使用==
进行比较,而不是=
,用于分配。
最后,您无法以这种方式比较字符串。字符串基本上是数组,而数组又使用指针表示。如果比较两个指针(ptr1 == ptr2
),它只检查两个字符串是否指向内存中的同一地址。由于字符串由多个字符组成,因此必须对它们进行迭代才能进行正确比较。幸运的是,标准库已经为此提供了一种方法。
修正一两个错误,这就是你得到的:
char *names[50][32];
char *states[50][2];
i = 0; // Assuming this is declared somewhere else
while ( i < b) {
if (strcmp(states[i], "tx") == 0) {
printf("a string %s\n", names[i]);
}
i = i + 1;
}
您还应该查看strcmp的文档。
编辑:因为这已经是已接受的答案,我还应该包含@dbush所指出的修复程序。 stats数组显然缺少额外字符串终止符的空格,因为字符串{C}以C终止。名称数组可能会或可能不会遇到同样的问题,但不清楚。无论如何,值得注意的是两者都应该包含一个用于存储终结符的额外字节:
NULL
支持@dbush。
答案 1 :(得分:1)
数组的声明看起来不正确:
char *names[50][32];
char *states[50][2];
这些声明了一对二维char指针数组,这可能不是你想要的。
char names[50][32];
char states[50][3];
这些是二维字符数组,或者是字符串数组。请注意,states
数组具有空格,用于终止NULL的额外字符。
在此if
声明中:
if (state[i] = "tx");{
由于;
在条件之后立即发生,因此结束if
块。因此,大括号内的以下语句将始终运行。此外,=
用于分配,而不是比较,但使用==
也不合适,因为该运算符不会比较字符串,而是比较它们的地址。您需要使用strcmp
进行字符串比较。
所以固定代码应如下所示:
char names[50][32];
char states[50][3];
...
i = 0;
while ( i < b) {
if (strcmp(state[i],"tx") == 0) {
printf("a string %s\n", names[i]);
}
i = i + 1;
}