c - 自定义读线功能
问题描述
我尝试编写一个简单的 read_line 函数,如下所示。
#include<stdio.h>
#define MSG_LEN 60
void read_line(char *,int);
int main(){
char msg_str[MSG_LEN+1];
read_line(msg_str,MSG_LEN);
printf("%s\n",msg_str);
return 0;
}
void read_line(char *str,int n){
char ch;
int i=0;
while((ch = getchar()) != '\n'){
if(i++ < n) {
*str++ = ch;
}
else {
printf("sentence is too long!\n");
break;
}
}
str[i]='\0';
}
结果是这样的
i'm felix
i'm felix?(
'?'and'(' 刚刚弹出!所以我试图将 str 声明为字符数组而不是字符指针。
void read_line(char str[],int n){
int i=0;
char ch;
while ((ch=getchar()) != '\n'){
if(i < n)str[i++] = ch;
else{
printf("Sentence is too long!\n");
break;
}
}
str[i]='\0';
}
它终于成功了。
i'm felix
i'm felix
有人可以帮我解释为什么第一个 read_line 函数不能正常工作吗?
解决方案
这是一个简单的修复。更改str[i]='\0'
为*str='\0'
如果你想用*(str+i)
还是str[i]
没关系,因为它们是100%等效的,但不要混用。理解这种等效性很重要,因为这是错误的直接来源。
我认为这是某种作业,但在其他情况下,有一个函数可以读取一行,它被称为fgets
.
我还可能会提到,在函数原型中使用时,char str[]
它 100% 等效于char *str
.
最后,ch
应该是一个 int,因为那是getchar()
返回的。它可以返回不适合 aa 的 EOF char
。
推荐阅读
- deep-learning - 用于瞳孔分割的 UNet 未训练,输出图像都相同
- excel - MS Excel:如何从一个单元格解析/解析数据值到其他 3 个单元格?
- php - 查询枢轴关系
- vue.js - 无头 UI 组件不会采用样式
- react-native - 由于重置 PREFIX 环境变量,NVM 偶尔会中断
- react-native - 如何从使用 Expo 和 React Native 构建的应用程序连接到 SSID?
- tensorflow - 当我更改批量大小时,不起作用(tensorflow)
- laravel - Laravel 雄辩的自我实现与 FK 和 INDEX
- powerbi - 使用 fact 和 dim 中的 key 会产生不同的结果
- javascript - 如何理解 VUEX-STORE 中的模块