Nick_is_asking Ответов: 3

Вырезать первую букву вывода с помощью fgets в C


Привет.
Я хочу дать ввод через fgets() ,но у меня проблемы.

Например, я даю :

привет и я принимаю Элло
Я передаю привет мир я получаю Элло мира
Как ее решить?

Спасибо!!!


Код:

Что я уже пробовал:

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


char *input();

int main(void)
{
    while(1)
    {
        char *a = input();
        printf("%s..." , a);
    }
}

char *input()
{
    printf("Give: ");
    char *word = malloc(sizeof(char) * 50);
    fgetc(stdin);   
    fgets(word , 100 , stdin); 
    return word;
}




Я немного изменил код (в моей базовой программе (это был просто тест)) ,и теперь вот так:


char *word = malloc(sizeof(char) * 100);

fgets(word , sizeof(word) , stdin);   /
while (fgets(word,sizeof(word),stdin) != NULL)
{
    break;
}
size_t len = strlen(word) - 1;
if (word[len] == '\n') //without newline
{
    word[len] = '\0';
}
return word;



Он идеально подходит для простых слов ,но когда я даю предложение ,например :
Привет мир ,я получаю привет w (без "orld").......

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
привет и я принимаю Элло

char *input()
{
    printf("Give: ");
    char *word = malloc(sizeof(char) * 50);
    fgetc(stdin);   // may be this is what eating the first letter
    fgets(word , 100 , stdin); 
    return word;
}

[Обновление]
Попробуйте заменить:
fgets(word , sizeof(word) , stdin);

с:
fgets(word , 100 , stdin);

слово-это указатель, его размер-это размер указателя, а не размер пространства, на которое он указывает.
В C/C++ массивы имеют np-знание своего собственного размера.


Рейтинг:
0

Rick York

Вот как бы я написал этот код :

void input( char buffer, size_t bufferSize )
{
    char * p;
    printf("Give: ");
    fgets( buffer, bufferSize, stdin );
    p = strchr( buffer, '\n' );
    if( p )
       *p = 0;     // null new line character if found
}

#define BUFFER_SIZE  79

int main(void)
{
    char buffer[ BUFFER_SIZE + 1 ] = { 0 };   // +1 for terminating null
    while(1)
    {
        input( buffer, BUFFER_SIZE );         // leave room for the null
        printf( "input was '%s'\n" , buffer );
        if( stricmp( buffer, "exit" ) == 0 )
            break;                            // give a way to escape the loop
    }
    return 0;
}


Nick_is_asking

Я тестирую его, и он работает, но когда я пытаюсь сделать это в своем базовом коде, я получаю: ошибка сегментации (ядро сбрасывается)

типа char *get_word(типа char *буфер , в size_t значение bufferSize , типа char *player_A , типа char *player_B , инт флаг)
{

char *p;

//fgetc(stdin);
fgets( buffer, bufferSize, stdin );
p = strchr( буфер, '\n' );
если( p )
{
*Р = 0;
}


обратный буфер;
}

В основном у меня есть это: char word[ 100 + 1 ] = { 0 }; и я звоню
char *str = get_word(word , 100 , A , B , 0);
но это не работает...

Rick York

Вы проходите А и Б, но с ними ничего не делается, так почему же вы проходите их?
Зачем утруждать себя возвращением адреса переданного буфера, если он уже известен?

Nick_is_asking

Потому что я хочу вернуть этот символ другим функциям(программа Большая).
Я перепробовал много методов ,но все равно ничего...

Рейтинг:
0

Nick_is_asking

Нет,это не работает.
Я немного изменил код (в моей базовой программе (это был просто тест)) ,и теперь вот так:

char *word = malloc(sizeof(char) * 100);

fgets(word , sizeof(word) , stdin);   /
while (fgets(word,sizeof(word),stdin) != NULL)
{
    break;
}
size_t len = strlen(word) - 1;
if (word[len] == '\n') //without newline
{
    word[len] = '\0';
}
return word;


Он идеально подходит для простых слов ,но когда я даю предложение ,например :
Привет мир ,я получаю привет w (без "orld").......


Richard MacCutchan

fgets(word , sizeof(word) , stdin);
То sizeof оператор-это операция времени компиляции, которая дает размер объекта, на который ссылается оператор. В вашем случае sizeof(word) дадим ответ 4, так как word это указатель. Так ты рассказываешь fgets что ваш буфер имеет ширину всего 4 байта.

[редактировать]
Я предполагаю, что вы строите 64-битную версию, так как размер вашего указателя будет составлять 8 байт.
[/редактировать]

Nick_is_asking

Спасибо за информацию.
Итак ,что я могу сделать?

Richard MacCutchan

Возьмите книгу на языке Си.

Но быстрое исправление вашего кода заключается в следующем:

#define BUFLEN 100
char *word = (char*)malloc(sizeof(char) * BUFLEN);

fgets(word, BUFLEN, stdin);
while (fgets(word, BUFLEN, stdin) != NULL)
{
// what is this loop for?
}

Nick_is_asking

Я студентка колледжа.В этом семестре у меня будет с,так что они дадут нам книгу.
Что касается этой петли ,то я нашел ее в интернете.

Richard MacCutchan

Перестаньте тратить свое время на копирование кода из интернета, который вы не понимаете. Это только сбьет вас с толку, когда вы попытаетесь выучить язык правильно.