[英]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.