gpt4 book ai didi

c - 需要有关循环和字符的建议

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:40 26 4
gpt4 key购买 nike

我正在编写一个简单的代码,它将读取一系列字符,这些字符在读取“\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;
}

但是,我尝试将循环条件移动到循环本身并使用 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;
}

有哪位专业人士可以向我解释一下为什么会这样,我该如何纠正?非常感谢! :)

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

最佳答案

了解 for 循环的工作原理。

for(expr1; expr2; expr3)  // lack of expr2 means 'forever'
instr;

相当于

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]);
}

关于c - 需要有关循环和字符的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50982615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com