C 需要关于循环和字符的建议
我正在编写一个简单的代码,它将读取一系列字符,这些字符在读取“\n”字符/键入enter时终止。代码最多只能读取50个字符。但是,我在编译时收到错误,这是一个错误。我不确定为什么循环没有结束,尽管接受了“\n”字符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
#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”
初始值的用途。再看一遍代码。@业余程序员请看扩展答案。@业余程序员请看扩展答案。