数组参数的fgets()

时间:2014-09-23 03:59:29

标签: c arrays fgets

仍然在教自己C.这一次,我正在尝试使用功能从键盘上读取文本:

int read_line(char my_string[]) {
    int characters;
    fgets(my_string, sizeof(my_string), stdin);
    characters = strlen(my_string);

    printf("characters =%d, my_string=%s. \n", characters , my_string);
}

int main(int argc, char *argv[]) {
    char line[MAX];
    read_line(line);
}

当我输入键盘时:

abcdefg

我在控制台上看到了这个:

characters =3, my_string=abc.

为什么C会以这种方式表现?通过方法读取字符串的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

你在你的fputs中使用sizeof。 C无法确定缓冲区的大小。 为了进一步说明,sizeof用于确定SIZEOF类型。

Example:
sizeof(short) = 2
sizeof(long) = 4
sizeof(char) = 1 (generally speaking, unless you compile for UNICODE)

原始代码不起作用的原因: 当你使用char []作为参数时,它会变成char *(指向char []的指针),这就是它的sizeof为4(指针通常是4个字节)的原因。如果在main()中使用sizeof(line),它将正确报告大小,因为编译器会在编译时更改代码以反映该信息。

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
int read_line(char my_string[]);

#define MAX 10

int _tmain(int argc, _TCHAR* argv[])
{
    char line[MAX];
    read_line(line);
    return 0;
}

int read_line(char my_string[]) {
    int characters;
    fgets(my_string, MAX, stdin); <--FIX here
    characters = strlen(my_string);

    printf("characters =%d, my_string=%s. \n", characters , my_string);
    return 0;
}

答案 1 :(得分:3)

WRONG:

 int read_line(char my_string[]) {
 int characters;
 fgets(my_string, sizeof(my_string), stdin);

尝试&#34; printf(&#34; sizeof my_string [] =%d \ n&#34;,my_string);

我打赌你会得到&#34; 4&#34;。

问题出在哪里。

相反,请指定缓冲区大小,例如&#34; 80&#34 ;.或者无论你分配了什么缓冲区。

实施例

int read_line(char my_string[]) {
    int characters;
    fgets(my_string, MAX, stdin);
    ...