簡體   English   中英

將一個字符串復制到另一個字符串,直到 C 中的某個字符

[英]Copy one string to another until certain character in C

所以,我正在用 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)

嗨,您可以將字符串提取到“。” 並將其存儲在不同的變量中。

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
}

你讓自己很尷尬。 您在使用fgets()處理輸入方面做得很好,但您不需要標記輸入行以分隔文件名和擴展名。 相反,(而不是使用strchr() ),使用strchr() strrchr()來定位最后一個'.' 在輸入字符串中。 這樣,如果您有一個類似於"somefile.version.ext"的文件名,您可以將文件名正確地分成名稱"somefile.version"和擴展名"ext"

strrchr將提供指向最后一個'.'的指針'.' 在輸入中(如果不包含'.' ,則為NULL )。 在那里你有由fgets()填充的數組的地址,你有最后一個'.'的地址'.' 在該字符串中,您需要做的就是減去strrchr()返回的指針和fgets()填充的數組以確定要復制的字符數。 然后對memcpy的簡單調用就是執行復制所需的全部內容,然后在此時終止新字符串。

例如,如果你用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不是空字符串.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

這只是一種更簡單的方法來處理分離而不是標記線。 仔細檢查一下,如果您有任何問題,請告訴我。

而不是char *nome_backup ,聲明應該是char* nome_backup

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM