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;
}