Скопируйте одну строку в другую до определенного символа в C - PullRequest
0 голосов
/ 02 апреля 2020

Итак, я создаю программу на c, которая работает с файлами. Я пытаюсь получить строку, которую пользователь набрал до определенного символа.
Например: пользователь набрал test.txt, мне понадобится другая переменная, чтобы получить весь текст до '.', Поэтому другой строкой будет test
Я использовал strchr, но он получает строку после точка, в которой я нуждаюсь, есть ли какой-нибудь простой способ получить деталь перед точкой?

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

#define MAX 100

int main()
{
    char nome_arquivo[MAX];
    char conteudo[MAX];
    char *nome_backup;

    printf("Nome do arquivo que deseja realizar BACKUP com a extensao: ");
    fgets(nome_arquivo, MAX, stdin);

    //Sempre cuidar com o \n pois ele pode causar erros.
    strtok(nome_arquivo, "\n");

    FILE *arq = fopen(nome_arquivo, "r");

    rewind(arq);
    printf("\nMensagem dentro do arquivo:\n");

    while (fgets(conteudo, MAX, arq) != NULL)
    {
        printf("%s\n",conteudo);
    }

    nome_backup = strchr(nome_arquivo, '.');

    printf("%s\n", nome_backup);

    //FILE *arqbak = fopen(strcat(,".bak"),"w");

}

ОБНОВЛЕНИЕ:

int main()
{
    char nome_arquivo[MAX];
    char conteudo[MAX];
    char *nome_backup;

    printf("Nome do arquivo que deseja realizar BACKUP com a extensao: ");
    fgets(nome_arquivo, MAX, stdin);

    //Sempre cuidar com o \n pois ele pode causar erros.
    strtok(nome_arquivo, "\n");

    FILE *arq = fopen(nome_arquivo, "r");

    rewind(arq);
    printf("\nMensagem dentro do arquivo:\n");

    while (fgets(conteudo, MAX, arq) != NULL)
    {
        printf("%s\n",conteudo);
    }

    nome_backup = strtok(nome_arquivo, '.');

    printf("%s\n", nome_backup);

    //FILE *arqbak = fopen(strcat(,".bak"),"w");

}

ОШИБКА: Segmentantion fault (core dumped)

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Вместо char *nome_backup объявление должно быть char* nome_backup.

0 голосов
/ 02 апреля 2020

Вы делаете это очень неловко для себя. Вы хорошо справляетесь с использованием fgets() для обработки ввода, но вам не нужно маркировать строку ввода для разделения имени файла и расширения. Вместо этого (и вместо использования strchr()) используйте strrchr(), чтобы найти последний '.' во входной строке. Таким образом, если у вас есть имя файла, похожее на "somefile.version.ext", вы можете правильно разделить имя файла на имя "somefile.version", а расширение "ext".

strrchr предоставит указатель на финал '.' на входе (или NULL, если '.' не включено). Там у вас есть адрес массива, заполненный fgets(), и у вас есть адрес последнего '.' в этой строке, все, что вам нужно сделать, это вычесть указатель, возвращенный strrchr(), и массив, заполненный fgets() определить количество символов для копирования. Тогда простой вызов memcpy - это все, что вам нужно для выполнения копирования, а затем nul-terminate новой строки в этой точке.

Например, если вы читаете с fgets() в buf, а затем хотите разделить buf на fname с именем файла и ext с расширением, все что вам нужно:

    char buf[MAXC], fname[MAXC], ext[MAXC], *p;
     ...
    if ((p = strrchr (buf, '.'))) {         /* get pointer to last '.' */
        memcpy (fname, buf, p - buf);       /* copy chars up to last '.' */
        fname[p-buf] = 0;                   /* nul-terminate fname */
        strcpy (ext, p+1);                  /* copy extension */
    }

Обратите внимание, что, поскольку у вас есть указатель к окончательному '.' все, что вам нужно сделать, это strcpy (ext, p+1);, чтобы скопировать расширение.

Короткий пример, который ставит его целиком и обрабатывает случай, когда в имени файла нет '.': :

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

#define MAXC 1024       /* if you need a constract, #define one (or moare) */ 

int main (void) {

    char buf[MAXC], fname[MAXC], ext[MAXC], *p;

    fputs ("enter filename: ", stdout);     /* prompt for filename */

    if (!fgets(buf, MAXC, stdin)) {         /* read/validate filename */
        fputs ("(user canceled input)\n", stderr);
        return 1;
    }

    buf[strcspn (buf, "\n")] = 0;           /* trim \n from end of buf */

    if ((p = strrchr (buf, '.'))) {         /* get pointer to last '.' */
        memcpy (fname, buf, p - buf);       /* copy chars up to last '.' */
        fname[p-buf] = 0;                   /* nul-terminate fname */
        strcpy (ext, p+1);                  /* copy extension */
    }
    else {  /* no '.' in buf */
        strcpy (fname, buf);                /* copy bur to fname */
        *ext = 0;                           /* make ext empty-string */
    }

    printf ("filename  : %s\n", fname);
    if (*ext)
        printf ("extension : %s\n", ext);
}

( примечание: вы должны проверить, что fname не является пустой строкой , чтобы обрабатывать точечные файлы, et c, .somefile - это вам осталось)

Пример использования / Вывод

$ ./bin/filename_ext
enter filename: somefile.ext
filename  : somefile
extension : ext

Что если в имени файла более одного '.' ?

$ ./bin/filename_ext
enter filename: somefile.version.ext
filename  : somefile.version
extension : ext

Что, если их нет?

$ ./bin/filename_ext
enter filename: somefilenoext
filename  : somefilenoext

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

0 голосов
/ 02 апреля 2020

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

int main() {

//User input array
char nome_arquivo[MAX];
printf("enter the string:");
scanf("%s",&nome_arquivo);

//Required array
char name[MAX];

//copying string upto "."
for(int i=0; i<MAX; i++) 
{
if (nome_arquivo[i]==".")
break;
else
name[i]=nome_arquivo[i]);
}

// now name consists of your required string
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...