当我使用fgets而不是获取

时间:2017-04-26 20:02:30

标签: c

这是我使用fgets时的图片。 (它不能正常工作,非常慢!!)

enter image description here

这是一张关于获取的图片。 (工作正常)

enter image description here

# define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

struct sNode {
    struct sNode* tNode;
    int G[20];
};

struct tNode {
    struct tNode* prev;
    struct tNode* next;
    int data;
    int used;
};

int convert_input(struct sNode** t_ArrayRef, char string[200])
{
    int j = 0, i = 0, temp = 0;
    int K[20];
    while (string[i] != '\0')
    {
        temp = 0;
        while (string[i] != ' ' && string[i] != '\0')
            temp = temp * 10 + (string[i++] - '0');
        if (string[i] == ' ')
        {
            i++;
        }

        (*t_ArrayRef)->G[j++] = temp;

    }

    return j - 1;
}

int main() {

int i;
char string[200];
char* str[5];

struct sNode* t = (struct sNode*)malloc(sizeof(struct sNode));

str[0] = string;


//fgets(str[0], sizeof(str[0]), stdin); // doesn't works !!!
gets(str[0]); // works !!!

int c = convert_input(&t, str[0]);

int num = t->G[0];
const int a = num;
struct tNode* tNod[6000];

for (i = 0; i<num; i++) {
    tNod[i] = (struct tNode*)malloc(sizeof(struct tNode));
}i = 0;

for (i = 1; i<num; i++) {
    tNod[i - 1]->data = i;
    tNod[i - 1]->used = 0;

    if (i != num - 1) {
        tNod[i - 1]->next = tNod[i];
    }
    else {
        tNod[i - 1]->next = tNod[i];
        tNod[i]->data = i + 1;
        tNod[i]->next = tNod[0];
    }
}i = 0;

struct tNode* current;

i = 1; int j = 0; int fCount = 0; int zCount = 0;
current = tNod[i - 1];
printf("<");
while (fCount == 0) {
    while (current->used == 1) {
        current = current->next;
        j++;
        if (j > num) {
            fCount = 1;
            break;
        }
    }
    j = 0;
    if (i % t->G[1] == 0 && fCount == 0) {
        zCount++;
        if (zCount != t->G[0]) {
            printf("%d, ", current->data, i);
            current->used = 1;
        }
        else {
            printf("%d", current->data, i);
            current->used = 1;
        }
    }
    i++;
    current = current->next;
}
printf(">");
return 0;

}

有人可以向我解释为什么我不能使用fgets工作吗?

1 个答案:

答案 0 :(得分:5)

使用时

fgets(str[0], sizeof(str[0]), stdin);

您没有传递正确的大小:sizeof(str[0])是指向char的指针的大小,而不是您存储在其中的200字节char数组的大小。< / p>

编译器在编译时解析此sizeof运算符。它不知道你放入元素零的价值。事实上,它完全忽略了零,取而代之的是sizeof(*str)

通过传递适当的大小来解决此问题:

fgets(str[0], sizeof(string), stdin);