string::size_type idx = str.find( str1 );只要str1超过一定长度,程序就崩溃

Andrewdavid 2016-08-24 05:23:54
各位老师好!
我在学习中遇到一个困难:
在一个数据包里有“INSERT INTO zdxx(cd1_bh,cd1_mc,xh,bh,rxm,zh,sj,xm,lx) VALUES ( 'B24 01', 'VICO', '01', '017000025615', 'XY', '201607006208', '2015-1-1 20:18:59.496', 'SB', 'XY' )”
我想准确地定位到“INSERT INTO zdxx(cd1_bh,cd1_mc,xh,bh,rxm,zh,sj,xm,lx) VALUES (”,然后用for循环(或更简单的方法)把VALUES后面括号里的9个值依次赋给九个string变量:cd1_bh,cd1_mc,xh,bh,rxm,zh,sj,xm,lx;或是char[ ]
我用string::size_type idx = str.find( str1 );的方法,只要str1超过一定长度,程序就崩溃了。
请教各位大侠,有么有什么简单的方法能一次实现这个功能?
...全文
260 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-29
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
oyljerry 2016-08-26
  • 打赏
  • 举报
回复
崩溃一般都是你查找的索引,后续处理的时候,有越界等
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
        k=sscanf(p,"%d%n",&v,&n); //从p所指位置开始企图获取一个整数并返回k(成功获取的整数个数)、n(扫描了几个字符)
        printf("k,v,n=%d,%d,%d\n",k,v,n);  
        if (1==k) {                                //            如果返回成功获取到一个整数
            p+=n;                                   //指针p向后移n个字符
        } else if (0==k) {                   //如果sscanf没有返回结果,说明现在指针p指向的不是一个可读的整数
            printf("skip char[%c]\n",p[0]); //输出第一个字符
            p++;                                           //p向后跳一个字符
        } else {//EOF==k                        //返回EOF,说明已经扫描到字符串末尾了
            break;                                    //跳出循环
Andrewdavid 2016-08-25
  • 打赏
  • 举报
回复
k=sscanf(p,"%d%n",&v,&n); //从p中获取数字并返回K(获取值的个数)、n=多少个字符 printf("k,v,n=%d,%d,%d\n",k,v,n); if (1==k) { // 如果执行成功 p+=n; //指针p移位n个 } else if (0==k) { //如果sscanf没有返回结果,说明现在指针p指向的是字母 printf("skip char[%c]\n",p[0]); //输出第一个字母 p++; //输出第二个字母 } else {//EOF==k //说明也没有 break; //跳出循环
Andrewdavid 2016-08-25
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
再供参考:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
k=sscanf(p,"%d%n",&v,&n); //从p中获取数字并返回K(获取值得个数)、n=多少个字符 printf("k,v,n=%d,%d,%d\n",k,v,n); if (1==k) { // 如果返回只有一个字符 p+=n; //指针p移位n个 } else if (0==k) { //如果sscanf没有返回结果,说明现在指针p指向的是字符 printf("skip char[%c]\n",p[0]); //输出第一个字符 p++; //输出第二个字符 } else {//EOF==k //说明也没有 break; //跳出循环
赵4老师 2016-08-24
  • 打赏
  • 举报
回复
再供参考:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
赵4老师 2016-08-24
  • 打赏
  • 举报
回复
仅供参考:
//NAME: essaie bla bla
//DIMENSION: 8
//DATA
//1  14  15
//2  11  10
//3  6   4
//4  7   13
//5  9   21
//6  19  3
//7  1   5
//8  8   8
//EOF
//
// 文本文件中可能还含有其他内容,但是需要用到的内容即以上

//比如data.txt:
//NAME: essaie bla bla
//其它内容
//DIMENSION: 8
//其它内容
//DATA
//其它内容
//1  14  15
//其它内容
//2  11  10
//其它内容
//3  6   4
//其它内容
//4  7   13
//其它内容
//5  9   21
//其它内容
//6  19  3
//其它内容
//7  1   5
//其它内容
//8  8   8
//其它内容
//EOF

// 目标是要获取NAME后字串,DIMENSION后数值,以及DATA以下的数值
// 其中NAME就是随便个字句,DIMENSION是城市数量,DATA以下是城市编号,X坐标,Y坐标
// 所有的这些将赋值给一个事先定义好的结构
#include <stdio.h>
#include <string.h>
#define MAXCPL   80   //每行最大字符数
#define MAXCITY  100  //每组数据中DATA最多项数,DIMENSION的最大值
#define MAXNAMEL 32   //NAME最大长度
struct S {
    char NAME[MAXNAMEL+1];
    int  DIMENSION;
    struct D {
        int NO;
        int X;
        int Y;
    } DATA[MAXCITY];
} s;
FILE *f;
int st,n,i;
char ln[MAXCPL];
int main() {
    f=fopen("data.txt","r");
    if (NULL==f) {
        printf("Can not open file data.txt!\n");
        return 1;
    }
    st=0;
    n=0;
    while (1) {
        if (NULL==fgets(ln,MAXCPL,f)) break;
        if (st==0) {
            if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;
        } else if (st==1) {
            if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;
        } else if (st==2) {
            if (0==strcmp(ln,"DATA\n")) st=3;
        } else if (st==3) {
            if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {
                n++;
                if (n>=MAXCITY || n>=s.DIMENSION) break;
            }
        }
    }
    fclose(f);
    printf("s.NAME=[%s]\n",s.NAME);
    printf("s.DIMENSION=%d\n",s.DIMENSION);
    for (i=0;i<n;i++) {
        printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);
    }
    return 0;
}
//s.NAME=[essaie bla bla]
//s.DIMENSION=8
//s.DATA[0].NO,X,Y=1,14,15
//s.DATA[1].NO,X,Y=2,11,10
//s.DATA[2].NO,X,Y=3,6,4
//s.DATA[3].NO,X,Y=4,7,13
//s.DATA[4].NO,X,Y=5,9,21
//s.DATA[5].NO,X,Y=6,19,3
//s.DATA[6].NO,X,Y=7,1,5
//s.DATA[7].NO,X,Y=8,8,8

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧