C 自定义读取行函数
我试着编写一个简单的read_-line函数,如下所示C 自定义读取行函数,c,string,C,String,我试着编写一个简单的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
#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';
}
“?”和“(”只要弹出!
所以我尝试将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';
}
有人能帮我解释一下为什么第一个read\u line函数不能正常工作吗?这是一个简单的修复方法。将
str[i]='\0'
更改为*str='\0'
如果您想使用*(str+i)
或str[i]
并不重要,因为它们是100%等效的,但不要混合使用。理解这种等效性很重要,因为这是错误的直接来源
我假设这是一种家庭作业,但在另一种情况下,有一个函数读取一行,它被称为fgets
我还可以提到,在函数原型中使用时,char-str[]
100%等同于char*str
最后,
ch
应该是一个int,因为这是getchar()
返回的。它可以返回EOF,而EOF不适合于achar
循环中的str
,因此当循环退出时,它指向最后读取的字符:str[i]
尝试将其进一步移动到边界之外。它与char str[]
或char*str
无关。作为函数参数(但仅作为函数参数),这两个参数是相同的。str[i]='\0';
*str='\0';
谢谢klutt。你的回答真的很有帮助。这实际上是c语言教科书中的一个练习。我做这个练习是为了将来当我需要特殊格式的read_line函数时可以调整自己。也感谢你指出ch类型错误。我太粗心了:P