C程序设计中的子串
我只想从字符串中提取特定的单词。C程序设计中的子串,c,C,我只想从字符串中提取特定的单词。 我的计划是: #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFFER_SIZE 100 int main() { FILE *f; char buffer[100]; char buf[100]; int count=0; char res[100]; f=fopen("1JAC.p
我的计划是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 100
int main() {
FILE *f;
char buffer[100];
char buf[100];
int count=0;
char res[100];
f=fopen("1JAC.pdb","rb");
while(fgets(buffer,BUFFER_SIZE,f))
{
if(strncmp(buffer,"ATOM",4)==0 && strncmp(buffer+13,"CA",2)==0 && strncmp(buffer+21,"A",1)==0)
{
strcpy(buf,buffer);
}
printf (buf);
但它不起作用有人能告诉我C中的子字符串吗?Memcpy似乎是最好的方法
char out[4] = {0};
strncpy(out, buf+17, 3);
memcpy( destBuff, sourceBuff + 17, 3 );
destBuff[ 3 ] = '\0';
如果需要,请记住添加空终止符(正如我在示例中所做的)
这一点以前也有过回答,多次出现堆栈溢出
()//使用下面的子字符串函数,它将帮助您。
int main(int argc,char*argv[])
{
文件*文件指针;
字符串[1700];
filepointer=fopen(“agg.txt”、“r”);
if(filepointer==NULL)
{
printf(“无法打开data.txt!\n”);
返回1;
}
while(fgets(string,sizeof(string),filepointer)!=NULL)
{
char*temp=substring(string,17,3);/*这里17是开始位置,3是要提取的字符串的长度*/
}
返回0;
}
字符*子字符串(字符*字符串,整数位置,整数长度)
{
字符*指针;
INTC;
指针=(字符*)malloc(长度+1);
if(指针==NULL)
{
printf(“无法分配内存。\n”);
出口(1);
}
对于(c=0;c
不要对二进制文件使用类似于fgets
的字符串读取功能。要么文件是二进制文件,在这种情况下,您应该使用适当的函数来读取它,要么文件是文本文件,在这种情况下,您应该打开它。这里的问题是双重的,因为文本文件和二进制文件之间的区别之一是换行符处理,而fgets
取决于换行符的正确处理。关于你的问题,当你说“它不工作”时,你能详细说明一下吗?你说“它不起作用”是什么意思?您引用的子字符串
函数是什么?哦,不要将任何地方的输入用作printf
的格式字符串。想想如果您读取的输入中有printf
格式化代码会发生什么?请注意strncpy
可能不会终止目标字符串,在这种情况下不会终止。不要使用strncpy(),这是一个危险的函数,因为这是一个非常空的终止问题。使用memcpy()并手动终止字符串是一种更安全(更快)的做法。这是有道理的,但一旦开始使用字符串函数,就应该坚持下去。将memcpy与strncmp/fgets混合使用可能会导致一组全新的问题。只有在处理二进制数据时才应使用memcpy。我们在这里处理的是什么?当将字符串的一部分复制到另一部分时,它都是二进制数据。我不同意你的评论。只要编码人员考虑字符的大小。由于他使用strcpy将文本从文件复制到缓冲区,因此它必须是文本缓冲区我们在这里处理的是C-文本缓冲区和二进制缓冲区有什么区别??无-它们都是字节、位模式、二进制。我真的没有得到你试图在这里介绍的Shlomi。我认为把字符串函数与二进制函数混合是不好的做法,除非需要。你是对的,在目前的情况下没有什么不同好的例子Rohit,但是在malloc错误上返回NULL并让函数的用户处理错误不是更好吗?我意识到这是你提供的一个使用示例,我想我会提到错误处理,谢谢Hanks Neil,是的,如果传递的参数为NULL,那么就会出现malloc错误。检查NULL值是用户的责任。有趣的是,人们坚持使用动态内存“节省空间”,然后在下一次呼吸中,毫不担心地在堆栈上分配1700字节…Lundin这是一个很好的笑话,但在评论之前,请询问我为什么使用1770字节??这就是bcoz,我正在读取的文件在一行中包含固定长度的1700字节数据。
memcpy( destBuff, sourceBuff + 17, 3 );
destBuff[ 3 ] = '\0';
//Use the following substring function,it will help you.
int main(int argc, char *argv[])
{
FILE *filepointer;
char string[1700];
filepointer=fopen("agg.txt", "r");
if (filepointer==NULL)
{
printf("Could not open data.txt!\n");
return 1;
}
while (fgets(string, sizeof(string), filepointer) != NULL)
{
char* temp=substring(string,17,3);/*here 17 is the start position and 3 is the length of the string to be extracted*/
}
return 0;
}
char *substring(char *string, int position, int length)
{
char *pointer;
int c;
pointer = (char*) malloc(length+1);
if (pointer == NULL)
{
printf("Unable to allocate memory.\n");
exit(1);
}
for (c = 0 ; c < length ; c++)
{
*(pointer+c) = *(string+position-1);
string++;
}
*(pointer+c) = '\0';
return pointer;
}