输入循环问题

时间:2015-07-19 01:30:11

标签: c arrays printing

我所做的是要求用户输入程序循环的次数,然后将值记录到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中的人的名字。

2 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。首先使用分号结束iffor构造是从C开始时常见的错误。基本上它会创建一个空的if语句,后跟一个代码块。以这种方式看待它:

if (condition)
   ; // Does nothing. The if is empty

// Totally unrelated block of code.
{
}

代码块通常对创建范围很有用,所以尽管编译器以这种方式解释块似乎没用,但实际上并非如此。在其他情况下也会发生这种情况,例如whilefor等等:

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;
}