Использование strcmp для прекращения записи в файл не работает - PullRequest
2 голосов
/ 25 февраля 2020

Я пишу следующий код, чтобы написать текст. Предполагается, что strcmp прекращает запись в файл, когда пользователь вводит #. Все еще не делает этого, и я не могу выйти из программы

#include <stdio.h>
#include <string.h>
int main()
{
    FILE *fp;
    char c[100];
    fp = fopen ("/home/smksx/Desktop/uniprograms/domes/arxeio2","w");
    printf ("\n\nWrite your text\n\n");
    printf ("\n\nTerminate with #\n\n");
    while (strcmp(c,"#")!=0)
        {
        scanf ("%s",&c);
        if (strcmp(c,"#")!=0)
            {
            fprintf (fp,"%s",c);
        }
    }
    fclose(fp);
    return 0;
}

Ответы [ 4 ]

2 голосов
/ 25 февраля 2020

у вас есть несколько проблем в вашем коде:

  1. c - указатель на символ, поэтому вы не можете использовать & в scanf

  2. ваше время l oop проверяет неинициализированные данные

  3. scanf читает до \ n и не добавляет его в файл

вот то, что вы можете написать код:

#include <stdio.h>
#include <string.h>
int main()
{
    FILE *fp;
    char c[100];
    fp = fopen ("/home/smksx/Desktop/uniprograms/domes/arxeio2","w");
    printf ("\n\nWrite your text\n\n");
    printf ("\n\nTerminate with #\n\n");
    while (1) // c is not initialized, so do not check it's content here
    {
        scanf ("%s",c);        // c is pointer to char, so no & here
        if (strcmp(c,"#")!=0)  // here c is safe to be checked
        {
            fprintf (fp,"%s\n",c);  // you may be adding a \n here
        }
        else 
            break;     // do not repeat yourself: no need to double strcmp
    }
    fclose(fp);
    return 0;
}
1 голос
/ 25 февраля 2020

Если strcmp не дает желаемых результатов, попробуйте strchr, чтобы найти #.
. Используйте поле точности, %.*s, для печати до #. Звездочка допускает переменную точность в качестве одного из аргументов для printf.
Если обработка слова за словом предпочтительнее, чем строка за строкой, поменяйте местами комментарий к операторам while, чтобы использовать scanf вместо fgets.

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

int main ( void) {
    char input[100] = "";
    char *find = NULL;

    //while ( 1 == scanf ( "%99s", input)) {//process word by word, no spaces
    while ( fgets ( input, sizeof input, stdin)) {
        input[strcspn ( input, "\n")] = 0;//remove newline
        if ( ( find = strchr ( input, '#'))) {//find a # in input
            if ( find != input) {//not the first character
                printf ( "%.*s\n", (int)(find - input), input);//print up to #
            }
            break;
        }
        else {
            printf ( "%s\n", input);//did not find #
        }
    }

    return 0;
}
0 голосов
/ 25 февраля 2020

Изначально в состоянии l oop

while (strcmp(c,"#")!=0)

используется неинициализированная переменная c. Таким образом, программа имеет неопределенное поведение. В этом вызове функции scanf

scanf ("%s",&c);

тип второго аргумента неверен. Тип выражения & c равен char ( * )[100], в то время как функция ожидает, что второй аргумент имеет тип char *.

Также вы должны проверить 1) был ли файл открыт успешно и 2) пользователь не прерывает ввод в массиве.

Вместо scanf, который читает до появления пробела при использовании спецификатора преобразования% s, гораздо лучше использовать стандартную функцию fgets.

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

Основная часть программы может выглядеть следующим образом.

if ( fp != NULL )
{
    while ( fgets( c, sizeof( c ), stdin ) != NULL && strcmp( c, "#" ) != 0 )
    {
        fprintf ( fp, "%s", c );
    } 
}

Обратите внимание, что fgets добавляет символ новой строки к введенной строке при условии, что строка с символом новой строки может быть размещена в массиве символов.

0 голосов
/ 25 февраля 2020

В вашем коде есть некоторые проблемы:

  1. Вы не можете использовать '&' при получении входного массива символов (то есть строки). Вместо этого вы должны использовать scanf("%s", c).

  2. Поскольку scanf "игнорирует" пробелы, я бы порекомендовал вам использовать fgets. Таким образом, ваш окончательный код может быть:

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

int main()
{
    FILE *fp;
    char c[100] = { 0 }; // init to empty string

    fp = fopen("out.txt", "w");
    printf("\n\nWrite your text\n\n");
    printf("\n\nTerminate with #\n\n");

    while (strcmp(c, "#") != 0)
    {
        fgets(c, sizeof(c), stdin);

        if (strcmp(c, "#\n") != 0) //fgets includes new line character too
            fprintf(fp, "%s", c);
    }

    fclose(fp);
    return 0;
}

fgets Функция читает всю строку текста (без опасности переполнения), так что это проще, чем scanf

Более того, я бы не советовал использовать полный путь при создании файла, потому что в других системах он может не работать (мне пришлось изменить его в Windows)

...