Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 自定义读取行函数_C_String - Fatal编程技术网

C 自定义读取行函数

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

我试着编写一个简单的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';
}
“?”和“(”只要弹出! 所以我尝试将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不适合于a
char

循环中的
str
,因此当循环退出时,它指向最后读取的字符:
str[i]
尝试将其进一步移动到边界之外。它与
char str[]
char*str
无关。作为函数参数(但仅作为函数参数),这两个参数是相同的。
str[i]='\0';
*str='\0';
谢谢klutt。你的回答真的很有帮助。这实际上是c语言教科书中的一个练习。我做这个练习是为了将来当我需要特殊格式的read_line函数时可以调整自己。也感谢你指出ch类型错误。我太粗心了:P