如何从调用者分配的内存空间中捕获被调用者组织的字符串数组?

时间:2017-04-10 16:56:19

标签: c arrays string

我想将一个内存空间传递给被调用者来收集一个从文件中过滤掉的字符串数组(即/ tmp / saveconfig,它列在问题的最后)。 通常,它应该具有以下输出,

/dev/disk/by-id/scsi-2001b4d2039784462
/dev/disk/by-id/scsi-2001b4d2049798685
/dev/disk/by-id/scsi-2001b4d2032048753

更具体地说,我假设调用者,即main(),只需通过char * ptr = malloc(4096)分配空格并将其传递给get_devs(),然后通过调用者释放空间。在get_devs()中组织字符串数组后,调用者可以使用char * dev []从分配的空间中迭代字符串。 换句话说,如何将* ptr与* dev []相关联? 但是根据下面的片段,我得到了分段错误。我哪里做错了?请给我一个提示。

int get_devs(char *pdev[])
{
    FILE *fp;
    char str[64];
    int len = 0, count = 0;
    char *cp, *ptr;

    /* opening file for reading */
    fp = fopen("/tmp/saveconfig", "r");
    if(fp == NULL) {
        perror("Error opening file");
        return(-1);
    }
    while(fgets(str, 64, fp) != NULL) {
        if (ptr = strstr(str, "/dev/")) {
            for (len = 1, cp = ptr; *cp != '\n'; len++, cp++) {
                if (*cp == '"') {
                    *cp = '\0';
                    break;
                }
            }
            strncpy(*pdev, ptr, len);
            printf("%s\n", pdev);
            pdev++;
            count++;
        }
    }
    fclose(fp);
    return count;   
}

int main()
{
    int i = 0, count = 0;
    char *pdev[64];

    count = get_devs(pdev);
    for (; i < sizeof(pdev) / sizeof(*pdev); i++) {
        printf("%s\n", pdev[i]);
    }
}

saveconfig文件如下,

{
  "fabric_modules": [], 
  "storage_objects": [
    {
      "attributes": {
        "block_size": 512, 
      }, 
      "dev": "/dev/disk/by-id/scsi-2001b4d2039784462", 
      "name": "scsi-2001b4d2039784462", 
      "plugin": "block", 
      "readonly": false, 
      "write_back": false
    }, 
    {
      "attributes": {
        "block_size": 4096
      }, 
      "dev": "/dev/disk/by-id/scsi-2001b4d2049798685", 
      "name": "scsi-2001b4d2049798685", 
      "plugin": "block", 
      "readonly": false, 
      "write_back": false
    }, 
    {
      "attributes": {
        "block_size": 512, 
      }, 
      "dev": "/dev/disk/by-id/scsi-2001b4d2032048753", 
      "name": "scsi-2001b4d2032048753", 
      "plugin": "block", 
      "readonly": false, 
      "write_back": false
    }
  ]
}

2 个答案:

答案 0 :(得分:1)

许多错误,但最重要的是:

strncpy(*pdev, ...)

为64个指向char的空间分配空间。但是你没有为角色本身分配任何空间,所以当你以后char *pdev[1000]; // How many lines in file? int i = 0; while (fgets(str... { pdev[i] = malloc(strlen(str) + 1); memmove(pdev[i], str, strlen(str) + 1); . . . i += 1; . . . 时,你要复制到随机存储器中。此外,您只使用第一个指针。你可能想要做的是:

function Enrique(){
    stat = 0;
    var ui = SpreadsheetApp.getUi();
    var response = ui.alert('Case Entry', 'Is this case being logged into the lab?', ui.ButtonSet.YES_NO); //Must answer "Yes". Script will end otherwise.
    if (response == ui.Button.YES) {
        //User said yes, logging into the lab
        var sh = SpreadsheetApp.getActiveSpreadsheet();
        var ss = sh.getActiveSheet();
        var cell = ss.getActiveCell();
        var ui = SpreadsheetApp.getUi();
        //Getting case number, not case sensitive
        var response = ui.prompt('Case Entry', 'What is the case number?', ui.ButtonSet.OK);
        var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
        var sheetNumber = sheets.length;
        var currentSheet = ss.getIndex();//-1
        //Make array
        Logger.log(currentSheet);
        SpreadsheetApp.setActiveSheet(sheets[currentSheet]);
        cell = sheets[currentSheet].getRange(1,1);
        var activeR = cell.getRow()-1;
        var activeC = cell.getColumn()-1;
        var data = sheets[currentSheet].getDataRange().getValues();
        var step = 0;
        //loop through data on sheet        
        var r = activeR;
        var c = activeC;
        var d = data[0].length;
        for(;r<d;++r){       
            for(;c<d;++c){          
                step++; 
                Logger.log('sheet : '+currentSheet+'    step:'+step+'   response.getResponseText() '+response.getResponseText()+'  =  '+data[r][c]);            
                if(data[r][c]==''||(step==1&&currentSheet==currentSheet)){ continue };                                                                          
                if(response.getResponseText().toString().toLowerCase()==data[r][c].toString().toLowerCase()){            
                    sheets[currentSheet].getRange(r+1,c+4).activate().setValue("Yes").setBackgroundRGB(0,255,0);                                                                                                                                                                             
                    Browser.msgBox("The case has been logged into the lab on the sheet 'Enrique'");       
                    stat = 1;
                    return                                                                                                              
                }
            }                                                                                                                          
        }
        if(stat === 0)
        {
           Browser.msgBox("The code failed somewhere...");
        }
    }
}

答案 1 :(得分:0)

试试这个:

   ptr = strstr(str, "/dev/");

   if (!ptr) {
        .....

   }

strstr()返回NULL,表示没有匹配 否则,它返回第一次出现的字符串的第一个字符的地址。