首页 > 解决方案 > 自定义读线功能

问题描述

我尝试编写一个简单的 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 函数不能正常工作吗?

标签: cstring

解决方案


这是一个简单的修复。更改str[i]='\0'*str='\0'

如果你想用*(str+i)还是str[i]没关系,因为它们是100%等效的,但不要混用。理解这种等效性很重要,因为这是错误的直接来源。

我认为这是某种作业,但在其他情况下,有一个函数可以读取一行,它被称为fgets.

我还可能会提到,在函数原型中使用时,char str[]它 100% 等效于char *str.

最后,ch应该是一个 int,因为那是getchar()返回的。它可以返回不适合 aa 的 EOF char


推荐阅读