簡體   English   中英

使用strcpy將字符串復制到使用atoi檢索的索引處的元素中

[英]using strcpy for copying string into the element at index retrieved with atoi

這是代碼,當輸入“歷史1”時,它應該在history執行第一個命令:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv[])
{
    int i=0; int j=0; int k=0;
    char inputString[100];
    char *result=NULL;
    char delims[] = " ";
    char historyArray[100][100] = {0};
    char *tokenArray[100][100] ;

    do
    {
        j = 0;
        printf("hshell>");
        gets(inputString);
        strcpy (historyArray[k], inputString);
        k++;

        // Break the string into parts
        result = strtok(inputString, delims);

        while (result!=NULL)
        {
            //result2 = result;
            strcpy(tokenArray[j], result);
            //puts(result);
            j++;
            result= strtok(NULL, delims);                  
            //puts(tokenArray[j]);     
        }
        //j = 0;
        puts(tokenArray[0]);
        puts(tokenArray[1]);

        if (strcmp(tokenArray[0], "exit") == 0)
        {
            return 0;
        }
        else if (strcmp(tokenArray[0], "history") ==  0)
        {
           if (j>1)
           {
              strcpy (result,historyArray[atoi(tokenArray[j-1])]);

           }
           else
           {
               //print history array
               for (i=0; i<k;i++)
                   printf("%i. %s\n", i+1, historyArray[i]);
           }
        }
        else
        {
          printf("Command not found\n");
        }
    }while (1);
}

然而,它崩潰了。 在調試時,我注意到兩件事: - 數組( tokenArray )地址超出界限 - 訪問沖突(分段錯誤) 您可以在下面的圖片中看到錯誤。

出界

分段故障

我錯過了什么? 我究竟做錯了什么?

您處理分段錯誤的原因是因為您嘗試將字符串復制到尚未分配的內存中。 您已將result定義為char*並且僅為其分配NULL ,因此嘗試將字符串復制到其中是錯誤的:

char *result = NULL;
// ...
strcpy(result, historyArray[atoi(tokenArray[j-1])]);

你需要分配一些內存, result將指向。 然后strcpy可用於將字符串復制到此內存中。 您可以使用malloc動態分配它,也可以將result定義為具有自動存儲持續時間的臨時變量(即char result[100]; )。


另請注意

char *tokenArray[100][100];

定義了一個指向char的二維指針數組。 但是在這種情況下你實際需要的是一個字符串數組,所以你需要像@cnicutar指出的那樣擺脫*


還有一點說明:

strcpy(result,historyArray[atoi(tokenArray[j-1])]);

是非常危險的事情,因為當atoi失敗時,你試圖從數組邊界訪問元素,這會產生未定義的行為 ,因此我建議你做這樣的事情:

char tokenArray[100][100] = {0};

int index;
char indexString[100] = "8";
if (sscanf(indexString, "%d", &index) == 1)     // integer successfully retrieved
{
    strcpy(tokenArray[index], "some string");
    printf("%s", tokenArray[8]);
}

你可能意味着char tokenArray[100][100]; 在1個令牌中創建100 tokens ,每個tokens包含100字符。

char *tokenArray[100][100]字面意思是tokenArray是一個包含100 char *100數組的數組。 但是,如果沒有為其分配正確的地址,則每個char *指向一個隨機地址。

您收到分段違例錯誤,因為其中一個char *包含您無法訪問的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM