无法通过使用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--;
}