Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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 需要关于循环和字符的建议_C_For Loop_Char - Fatal编程技术网

C 需要关于循环和字符的建议

C 需要关于循环和字符的建议,c,for-loop,char,C,For Loop,Char,我正在编写一个简单的代码,它将读取一系列字符,这些字符在读取“\n”字符/键入enter时终止。代码最多只能读取50个字符。但是,我在编译时收到错误,这是一个错误。我不确定为什么循环没有结束,尽管接受了“\n”字符 #include <stdio.h> #include <ctype.h> #define MAX 50 int main(void){ char str[MAX] = "0"; //initialise 1st c

我正在编写一个简单的代码,它将读取一系列字符,这些字符在读取“\n”字符/键入enter时终止。代码最多只能读取50个字符。但是,我在编译时收到错误,这是一个错误。我不确定为什么循环没有结束,尽管接受了“\n”字符

 #include <stdio.h>
 #include <ctype.h>
 #define MAX 50

 int main(void){
     char str[MAX] = "0";             //initialise 1st char for the loop
     int i;
     printf("Enter your sentence, at most 50 character: \n");
     for(i = 0; str[i] != '\n'; i++){          //terminates upon \n
        str[i] = getchar();
        putchar(str[i]);
     }
     return 0;
 }
#包括
#包括
#定义最大值50
内部主(空){
char str[MAX]=“0”;//初始化循环的第一个字符
int i;
printf(“输入您的句子,最多50个字符:\n”);
对于(i=0;str[i]!='\n';i++){//终止于\n
str[i]=getchar();
putchar(str[i]);
}
返回0;
}
但是,我尝试将循环条件移动到循环本身中,并使用if-break组合,它可以完美地工作

#include <stdio.h>
#include <ctype.h>
#define MAX 50

int main(void){
    char str[MAX] = "0";             //initialise 1st char for the loop
    int i;
    printf("Enter your sentence, at most 50 character: \n");
    for(i = 0;; i++){          //terminates upon \n
        str[i] = getchar();
        putchar(str[i]);
        if(str[i] == '\n')
        break;
    }

    return 0;
}
#包括
#包括
#定义最大值50
内部主(空){
char str[MAX]=“0”;//初始化循环的第一个字符
int i;
printf(“输入您的句子,最多50个字符:\n”);
对于(i=0;i++){//终止于\n
str[i]=getchar();
putchar(str[i]);
如果(str[i]='\n')
打破
}
返回0;
}
请任何专业人士向我解释为什么会这样,我如何纠正它?提前多谢!:)


决心。我正在检查数组中的错误元素。哈哈。

了解
for
循环的工作原理

相当于

expr1;
while(expr2)  // expr2 is replaced with 'true' if empty
{
    instr;
    expr3;
}
那么你的情况呢

for(i = 0; str[i] != '\n'; i++)
测试
str[i]!='\n'
是在增量
i++
之后计算的,因此它测试了数组中错误的元素–超过刚刚读取的元素

此外,不检查输入数据的长度,因此,如果输入的输入行长度超过50个字符,循环将尝试存储超过已声明数组结尾的行尾,这将触发未定义行为

编辑

满足这两个标准的简单方法是进行两项测试:

char str[MAX];
int i;

// print the actual value of defined maximum
printf("Enter your sentence, at most %d character: \n", MAX);

for(i = 0; i < MAX; i++){  // test the length
    str[i] = getchar();
    if(str[i] == '\n')     // test the input char
        break;
    putchar(str[i]);
 }
charstr[MAX];
int i;
//打印定义的最大值的实际值
printf(“输入您的句子,最多%d个字符:\n”,最大值);
对于(i=0;i
了解
for
循环的工作原理

相当于

expr1;
while(expr2)  // expr2 is replaced with 'true' if empty
{
    instr;
    expr3;
}
那么你的情况呢

for(i = 0; str[i] != '\n'; i++)
测试
str[i]!='\n'
是在增量
i++
之后计算的,因此它测试了数组中错误的元素–超过刚刚读取的元素

此外,不检查输入数据的长度,因此,如果输入的输入行长度超过50个字符,循环将尝试存储超过已声明数组结尾的行尾,这将触发未定义行为

编辑

满足这两个标准的简单方法是进行两项测试:

char str[MAX];
int i;

// print the actual value of defined maximum
printf("Enter your sentence, at most %d character: \n", MAX);

for(i = 0; i < MAX; i++){  // test the length
    str[i] = getchar();
    if(str[i] == '\n')     // test the input char
        break;
    putchar(str[i]);
 }
charstr[MAX];
int i;
//打印定义的最大值的实际值
printf(“输入您的句子,最多%d个字符:\n”,最大值);
对于(i=0;i发生这种情况是因为在
str[i]=getchar()之后的第一种情况下
,在
str[i]!=”之前执行
i++
语句\n′条件检查。因此,在第一个代码中检查失败

对循环尝试此修改的
:-

for(i = 0; (str[i] = getchar()) != '\n'; i++){     //Here checking happens while reading itself.
        putchar(str[i]);
     }

请记住,在执行
for循环
主体之后,控制流跳回到
增量语句
而不是
条件检查
这是因为在
str[i]=getchar()之后的第一种情况下发生的
,在
str[i]!=”之前执行
i++
语句\n′条件检查。因此,在第一个代码中检查失败

对循环尝试此修改的
:-

for(i = 0; (str[i] = getchar()) != '\n'; i++){     //Here checking happens while reading itself.
        putchar(str[i]);
     }

请记住,在执行
for循环
主体之后,控制流跳回到
增量语句
而不是
条件检查

for(init;test;incr)
中的增量步骤在进入循环后的测试之前发生。想一想。与第一个代码示例中的
'\n'
相比,您真正比较的是什么。检查MAX从未完成。C不要为你做这样的测试->非常感谢!我完全没有意识到,尽管盯着它看了这么久。在第一次迭代中,您尝试检查str[0]!='\n'但您尚未在输入中使用str[0]字符。@sopho saksham这就是
“0”
初始值的用途。再次查看代码。
for(init;test;incr)
的增量步骤发生在循环进入测试之前。想一想。与第一个代码示例中的
'\n'
相比,您真正比较的是什么。检查MAX从未完成。C不要为你做这样的测试->非常感谢!我完全没有意识到,尽管盯着它看了这么久。在第一次迭代中,您尝试检查str[0]!='\n'但您尚未在输入中使用str[0]字符。@sopho saksham这就是
“0”
初始值的用途。再看一遍代码。@业余程序员请看扩展答案。@业余程序员请看扩展答案。