2015-07-19 95 views
0

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

提示:什么是',''中如果(状态[i] = “TX”); {'怎么办? –

+0

此代码不能编译。没有声明'状态'。 –

+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所述。统计数组显然缺少额外字符串终止符的空间,因为字符串是以C终止的NULL。名称数组可能会也可能不会遇到同一问题,但尚不清楚。无论如何,值得注意的是,两者都应该包含一个额外的字节来存储终止符:

char names[50][33]; 
char states[50][3]; 

支持@dbush。

+0

非常感谢你,我会检查出strcmp,我从来没有听说过它之前 – Michael

+0

在这种情况下,我建议你看看[string.h/cstring](http://www.cplusplus.com/reference/cstring/)的文档。了解C语言中的字符串函数,它们对于几种场景很有用。 –

+0

看我的编辑。 @dbush注意到我没有的东西。 –

1

您的阵列的声明显示不正确:

char *names[50][32]; 
char *states[50][2]; 

这些声明对二维数组字符指针的,这可能不是你想要的。

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

'strcmp'应该比较为零! –

+0

@AndréFratelli谢谢。修正了 – dbush

+0

另外请注意,您忘记了最后一个示例中空终止符的额外字节。由于我的回答已经被接受,我将其列入并给了你信用。我希望你不介意。 –