C 什么';这个小程序怎么了?

C 什么';这个小程序怎么了?,c,while-loop,C,While Loop,while将跳过“\0”,因为它不是“%”,while将跳过“\0”,因为它不是“%”。@BryanOlivier是对的,所以 void main(){ /* This string needs to be printed without the '%' and in segments. */ char str[] = "Oct: %o Dec: %d Roman: %r"; int i = 0; while (str[i] != '\0'){ /* When I

while将跳过“\0”,因为它不是“%”

,while将跳过“\0”,因为它不是“%”

。@BryanOlivier是对的,所以

void main(){
/* This string needs to be printed without the '%' and in segments. */
    char str[] = "Oct: %o Dec: %d Roman: %r"; 
    int i = 0;

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

/* When I run this nested loops, for some reason they don't stop at '\0'. */

        while (str[i] != '%'){
            printf("%c", str[i++]);
        }
        if (str[i] == '%')
            i++;
    }    
}
而不是

while ((str[i] != '%')&&(str[i] != '\0')){
        printf("%c", str[i++]);
    }

试试这个。

@BryanOlivier是对的,所以

void main(){
/* This string needs to be printed without the '%' and in segments. */
    char str[] = "Oct: %o Dec: %d Roman: %r"; 
    int i = 0;

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

/* When I run this nested loops, for some reason they don't stop at '\0'. */

        while (str[i] != '%'){
            printf("%c", str[i++]);
        }
        if (str[i] == '%')
            i++;
    }    
}
而不是

while ((str[i] != '%')&&(str[i] != '\0')){
        printf("%c", str[i++]);
    }

尝试此操作。

您正在尝试打印字符串中的所有字符,忽略任何
%
字符。你不需要一个内环,内环是你所有痛苦的原因。内部循环将超出字符串的结尾,因为它不测试空终止字符

简单的解决方案是用
if
语句替换内部循环。其思想是遍历整个字符串,并打印任何不是
%
的字符

 while (str[i] != '%'){
        printf("%c", str[i++]);
    }
虽然我可能会用指针来写:

int i = 0;
while (str[i] != '\0')
{
    if (str[i] != '%')
        printf("%c", str[i]);
    i++;
}    

另外,您的
main
函数有一个非标准声明。对于不希望处理参数的C
main
,您的main应该是:

const char *p = str;
while (*p)
{
    if (*p != '%')
        printf("%c", *p);
    p++;
}    

您正试图打印字符串中的所有字符,但忽略了所有
%
字符。你不需要一个内环,内环是你所有痛苦的原因。内部循环将超出字符串的结尾,因为它不测试空终止字符

简单的解决方案是用
if
语句替换内部循环。其思想是遍历整个字符串,并打印任何不是
%
的字符

 while (str[i] != '%'){
        printf("%c", str[i++]);
    }
虽然我可能会用指针来写:

int i = 0;
while (str[i] != '\0')
{
    if (str[i] != '%')
        printf("%c", str[i]);
    i++;
}    

另外,您的
main
函数有一个非标准声明。对于不希望处理参数的C
main
,您的main应该是:

const char *p = str;
while (*p)
{
    if (*p != '%')
        printf("%c", *p);
    p++;
}    

问题是一旦你到了这里:

int main(void)
内部while循环将永远保持旋转(您可以通过移除
r
,验证它是否会停止)

要解决此问题,您可以将
while(str[i]!='%')
替换为
if(str[i]!='%')
,而不必触摸原始字符串

还有几点意见:

main
的返回类型从
void
更改为
int
。添加
返回0
就在
main
的右括号之前。这是一个典型的C约定,它向操作系统指示运行是否成功(0表示正常,非零表示有问题)

如果您在编译代码时带有警告,那么您应该会得到警告(一定要启用它们,因为有些bug并不总是那么明显,警告可以很好地通知您)


使用GCC编译器,我得到了警告:“main”的返回类型不是“int”[-Wmain]。我使用
-Wall
-Wextra
标志运行它。

问题是,一旦您到达这里:

int main(void)
内部while循环将永远保持旋转(您可以通过移除
r
,验证它是否会停止)

要解决此问题,您可以将
while(str[i]!='%')
替换为
if(str[i]!='%')
,而不必触摸原始字符串

还有几点意见:

main
的返回类型从
void
更改为
int
。添加
返回0
就在
main
的右括号之前。这是一个典型的C约定,它向操作系统指示运行是否成功(0表示正常,非零表示有问题)

如果您在编译代码时带有警告,那么您应该会得到警告(一定要启用它们,因为有些bug并不总是那么明显,警告可以很好地通知您)


使用GCC编译器,我得到了警告:“main”的返回类型不是“int”[-Wmain]。我使用
-Wall
-Wextra
标志运行它。

您应该改为-->


您应该这样做-->


while(str[i]!='%')
将跳过
\0
。为什么您希望内部循环停止在
\0
?哦,别忘了
void main()
是坏的。使用
int-main()
int-main(int-argc,char*argv[])
@tangrs因为这是C,所以它应该是
int-main(void)
两者都可以工作,但是
int-main(void)
更好,并且可以避免在迂腐的编译器上出现一些警告。
while(str[i]!='%”
将跳过
\0
。为什么希望内部循环在
\0
处停止?哦,别忘了
void main()
是坏的。使用
int-main()
int-main(int-argc,char*argv[])
@tangrs因为这是C,所以应该是
int-main(void)
两者都可以工作,但是
int-main(void)
更好,可以避免在迂腐的编译器上出现一些警告。你关于警告的观点很好。我倾向于推荐使用
-Wall-Werror
运行
clang
gcc
。谢谢,我会补充这一点来回答:)你关于警告的观点很好。我倾向于建议使用
-Wall-Werror
运行
clang
gcc
。谢谢,我会在回答时添加这一点:)