Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C while循环在for循环之后不执行_C - Fatal编程技术网

C while循环在for循环之后不执行

C while循环在for循环之后不执行,c,C,我正在学习C编程方法,我有一个关于循环的问题。 我正在使用linux debian进行编译 这是代码 #include <stdio.h> int main () { char s1[] = "abcdef"; char s2[] = "aaaaaa"; int i, j; printf("\ndebut:%s\n", s1); for (i = j = 0; s1[i] != '\0'; ++i, ++j){ if

我正在学习C编程方法,我有一个关于循环的问题。 我正在使用linux debian进行编译

这是代码

#include <stdio.h>

int main ()
{
    char s1[] = "abcdef";
    char s2[] = "aaaaaa";   
    int i, j;

    printf("\ndebut:%s\n", s1);

    for (i = j = 0; s1[i] != '\0'; ++i, ++j){
        if (s1[i] == s2[j]){
            printf("before %c\n", s1[i]);
            s1[i] = '\0';
        }   
        else if (s1[i] != s2[j]){
            s1[i] = s1[i];
            printf("after copy %c\n", s1[i]);
        }
    }

    printf("\nEnd of for loop write final result\n.");

    i = j = 0;

    while (s1[i] != '\0'){
        printf("final is :%c ", s1[i]);
        ++i;
    }

    return 0;
}
#包括
int main()
{
字符s1[]=“abcdef”;
字符s2[]=“AAAAA”;
int i,j;
printf(“\n但:%s\n”,s1);
对于(i=j=0;s1[i]!='\0';++i,++j){
if(s1[i]==s2[j]){
printf(“在%c\n之前”,s1[i]);
s1[i]='\0';
}   
如果(s1[i]!=s2[j]){
s1[i]=s1[i];
printf(“在副本%c\n之后”,s1[i]);
}
}
printf(“\n循环写入最终结果的名称”);
i=j=0;
而(s1[i]!='\0'){
printf(“最终版本为:%c”,s1[i]);
++一,;
}
返回0;
}
这段代码假设在我的示例中删除开头字母“a”的一个字母,然后while循环将遍历每个位置以打印结果

看起来第一部分正在工作,但程序从未执行while循环

你知道为什么吗

谢谢您执行此操作

s1[i] = '\0';
当i=0时,while条件

while (s1[i] != '\0') { ...

如果为false,则从不执行循环。

在for循环的第一次迭代中,将
'\0'
分配给
s[0]

// s1[0] is 'a', s2[0] is 'a'
if (s1[i] == s2[j]){
    printf("before %c\n", s1[i]);
    s1[i] = '\0';
}   
所以它保持不变(因为
i
j
都是递增的)。当您进入
while
循环时,
s[0]
仍然是
'\0'
,因此它甚至不会执行一次。

更改

if (s1[i] == s2[j]){
    printf("before %c\n", s1[i]);
    s1[i] = '\0';

}  


使您的
while
循环工作。

那么,您的循环条件的计算结果为false。因此,是时候学习如何使用调试器并检查变量了。空字符表示字符串在该位置结束,而不应认为它跳过了一个字符。我不确定你的代码是否假设了这一点。这个问题似乎离题了,因为它没有演示任何调试尝试。将
s1[I]=s1[I]
更改为你想做的任何事情(可能是
s1[I]=s2[I]
或其他什么)是的,你肯定应该尝试调试你的代码(printf通常就足够了)在问你是否真的想学习之前。无论如何,为了帮助您,我以更清晰的方式缩进了您的代码(无论算法如何),非常感谢您的快速回答。我完全理解我只需要复制i+1值而不是“\0”值。
if (s1[i] == s2[j]){
    printf("before %c\n", s1[i]);
    s1[i] = ' ';  
}