无法通过使用i--从argc开始并倒计时到0使这些循环倒数
我遇到了一件棘手的事情。这是原始程序:无法通过使用i--从argc开始并倒计时到0使这些循环倒数,c,while-loop,segmentation-fault,C,While Loop,Segmentation Fault,我遇到了一件棘手的事情。这是原始程序: #include <stdio.h> int main(int argc, char *argv[]) { // go through each string in argv int i = 0; while(i < argc) { printf("arg %d: %s\n", i, argv[i]); i++; } // let's make our own a
#include <stdio.h>
int main(int argc, char *argv[])
{
// go through each string in argv
int i = 0;
while(i < argc) {
printf("arg %d: %s\n", i, argv[i]);
i++;
}
// let's make our own array of strings
char *states[] = {"cali","heo","arb","flu"};
int num_states = 4;
i = 0; // watch for this
while(i < num_states) {
printf("state %d: %s\n", i, states[i]);
i++;
}
return 0;
}
输出:
$ make while
$ ./while hey how
2 how
1 hey
0 ./while
Segmentation fault (core dumped)
$
另一种输出方式--
因此,我声称我“无法以上述方式同时执行两个while循环”。我已初始化
I=2
,并将其递减,我已将I
值重新初始化为3。循环的想法是从I
设置为最大值开始,并在每次迭代时递减I
:
i = argc;
while (--i >= 0)
printf("arg %d: %s\n", i, argv[i]);
i = 4;
while (--i >= 0)
printf("state %d: %s\n", i, states[i]);
以下代码:
while(i < num_states) { <---------------------- HERE
printf("state %d: %s\n", i, states[i]);
i--;
}
在这里:
在
while(i=0)//错误出现在while(i=0)//中的while
循环中,您的逻辑不好
{
printf(“arg%d:%s\n”,argc-i,argv[argc-i]);//此处的更改
我--;
}
字符*状态[]={
“cali”、“heo”、“arb”、“flu”
};
int num_states=4;
i=3;//注意这个
而(i>=0){//
printf(“状态%d:%s\n”,num_states-i,states[num_states-i]);//这里也是
我--;
}
返回0;}
注意:第二个程序中的while(i
肯定会造成严重问题,因为每次都会满足条件,因为i
在每次迭代后减少1,并且num\u states
保持固定在4。int max=4;
int max = 4;
int i = max;
while(i > 0)
{
// backward count
cout << "state " << i << " " << states[i-1] << endl;
printf("state %d %s\n", i, states[i-1]);
// forward count
cout << "state " << max-i << " " << states[max-i] << endl;
printf("state %d %s\n", max-i, states[max-i]);
i--;
}
int i=最大值;
而(i>0)
{
//倒计时
cout因为条件是
while(i < num_states)
通过这种方式,您可以按相反的顺序输出数组。要生成相同的输出,您可以执行以下操作:
int num_states = 4;
i = num_states - 1;
while( (num_states - i - 1) < num_states) {
printf("state %d: %s\n", num_states - i - 1, states[num_states - i - 1]);
i--;
}
int num_states=4;
i=num_states-1;
而((num_states-i-1)
尽管这看起来像是一个代数技巧。分段错误是因为当i为负时试图调用argv[i](或states[i]),但这是因为循环结构存在逻辑缺陷
例如,在第一个循环中:
int i = 2;
while(i < argc) {
printf("arg %d: %s\n", i, argv[i]);
i--;
}
这样,我从argv的最后一个索引开始(它是argc-1,因为argc是数组中的元素数,argv是以元素0开头的数组。因此,例如,如果argc是5,则此代码将通过argv[0]打印argv[4])
我发现思考while循环的最好方法是用基础英语。“在y为真时重复x”。在代码中,y始终为真,因此x永远重复(或者,在本例中,直到出现分段错误)
看看你是否能把这个逻辑也应用到你的另一个循环中去。学c玩得开心吧!使用i=argc;
和while(i)
。但是要按顺序打印它们,你必须执行argv[arc-i]
也许他想按他提供的顺序打印它们。使用argv[argc-i]
和状态[4-i]
我想更好。@Koushik不,不是为了顺序,但我只是想通过递减来执行代码,我无法执行两个循环,但提供的解决方案都起作用了:)…就像我被分割错误的事情困扰了一样……但我所做的是一个愚蠢的错误……)@Jonathan Leffler无法投票赞成这个解决方案,因为我的声誉操作级别不要假设argc是2,只需将其分配给i
:)OP似乎事先知道它是2。否则,通常我会编写come代码,以查看argc是否与参数数匹配。argc是参数数。您希望如何检查它是否为参数数?@Redx如果说4是预期的参数数to main(),然后添加一个if
块,该块在argc!=4
@Koushik使用i=2
而不是i=argc
确实不正确时生成警告。但我们希望指出错误的来源,而不是彻底检查整个程序。如果argc!=状态中的元素数?@RedX;那么您的imp有故障编译器的实现。:)毕竟,我只是在处理给定的示例,假设“states”只是替代了argv,使其在该特定示例中更易于解释,而不是说argc实际上引用的是状态中的数字。在不更改逻辑的情况下,我也可以使用argv而不是状态。@Devolus它不可能是错误的编译器实现。状态是在程序argc中声明的一种类型,可以是/不能是/不必等于数组状态的元素数。第一个while循环处理环境提供的变量。第二个循环处理局部变量。我不打算编写整个程序,我只是试图说明如何使用索引。但是,我现在将示例重命名为max,这真的有很大的不同。@Devol我们是的,我纠正了…谢谢你…这是我错过的东西…)谢谢你提醒我:)我不能投票赞成这个解决方案,因为我的声誉水平嘿,这很好:)我很高兴我能帮上忙!别担心,我知道我在某些方面很有用就足够了。
while(i >= 0)
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 2; // If OP is certain argc is 2!Better use i=argc instead
while(i >= 0) //Error was here
{
printf("arg %d: %s\n",argc-i, argv[argc-i]); // alteration here
i--;
}
char *states[] = {
"cali","heo","arb","flu"
};
int num_states = 4;
i = 3; // watch for this
while(i >=0) { //alteration here
printf("state %d: %s\n", num_states-i, states[num_states-i]); // Here too
i--;
}
return 0;}
int max = 4;
int i = max;
while(i > 0)
{
// backward count
cout << "state " << i << " " << states[i-1] << endl;
printf("state %d %s\n", i, states[i-1]);
// forward count
cout << "state " << max-i << " " << states[max-i] << endl;
printf("state %d %s\n", max-i, states[max-i]);
i--;
}
while(i < num_states)
i = num_states - 1;
while (i >= 0)
int num_states = 4;
i = num_states - 1;
while( (num_states - i - 1) < num_states) {
printf("state %d: %s\n", num_states - i - 1, states[num_states - i - 1]);
i--;
}
int i = 2;
while(i < argc) {
printf("arg %d: %s\n", i, argv[i]);
i--;
}
int i = argc-1;
while(i >= 0) {
printf("arg %d: %s\n", i, argv[i]);
i--;
}