Распечатка слово за словом с помощью указателей - PullRequest
2 голосов
/ 30 марта 2020

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

    char str[100];
    char *p;

    printf("\nSentence: ");
    scanf("%s", str);

    p=str;

    while(*p!='\0'){
        if(*p == ' '){
            printf("\n");
        }else{
            printf("%c", *p);
        }
        p++;
    }

Ответы [ 5 ]

1 голос
/ 30 марта 2020

Использование функции scanf в формате "%s" пропускает начальные пробелы и считывает символы, пока не встретятся пробелы.

Таким образом, вы не можете ввести предложение, используя этот формат,

Вместо этого используйте стандартную функцию fgets.

Кроме того, учтите, что пользователь может разделять слова несколькими пробелами или табуляциями. В этом случае ваш вывод будет недействительным, потому что будет много пустых строк.

Более эффективно использовать стандартные C функции strspn и strcspn.

Здесь демонстрационная программа.

#include <stdio.h>
#include <string.h>

int main(void) 
{
    enum { N = 100 };
    char str[N] = "";

    printf( "Enter a Sentence: " );

    fgets( str, N, stdin );

    str[ strcspn( str, "\n" ) ] = '\0';

    const char *p = str;

    const char *delim = " \t";

    while ( *p )
    {
        p += strspn( p, delim );

        const char *q = p;

        p += strcspn( p, delim );

        if ( p != q )
        {
            printf( "%*.*s\n", ( int )( p - q ), ( int )( p - q ), q );
        }
    }

    return 0;
}

Если, например, ввести следующий оператор

Have a nice day Luka Milicevic

, то вывод программы будет

Enter a Sentence: Have a nice day Luka Milicevic
Have
a
nice
day
Luka
Milicevic
1 голос
/ 30 марта 2020

Вы можете использовать gets_s вместо scanf("%s"):

gets_s(str, sizeof(str));

Тогда ваш код будет работать нормально.

scanf("%s") получит только одно слово из стандартного ввода.

С другой стороны, gets_s получит целую строку.

Но gets_s () может работать только в Visual Studio, чтобы сделать его переносимым, лучше использовать fgets() .

0 голосов
/ 30 марта 2020

Вы также можете использовать scanf, как

scanf("%99[^\n]", str);

. Он будет читать любой не '\n' (конец строки) символ до 99, поэтому ваш буфер не будет переполнен.

Хотя использование fgets безопаснее.

0 голосов
/ 30 марта 2020

scanf читает строку до первого пробела. Если вы введете предложение типа «первая секунда», будет прочитано только «первое». Чтобы прочитать полную строку, вы должны использовать fgets.

Старайтесь избегать использования gets, так как это не ограничивает число символов для чтения, что может привести к уязвимости безопасности.

0 голосов
/ 30 марта 2020

scanf будет считываться до первого пробела, поэтому только первое слово будет сохранено в str.

используйте fgets вместо scanf :( использование fgets является безопасным способом)

#include <stdio.h>

int main()
{
    char str[100];
    char* p;

    printf("\nSentence: ");
    fgets(str, 100, stdin);
    p = str;

    while (*p != '\0') {
        if (*p == ' ') {
            printf("\n");
        }
        else {
            printf("%c", *p);
        }
        p++;
    }
    return 0;
}
...