2012-10-09 116 views
-1

我的代碼不起作用。我收到一個字符串的時候出現運行時錯誤。這段代碼有什麼問題?錯誤讀取字符串

//this is what i have in main() 
char *ele,*s[max]; 
int *count,temp=0; 
count=&temp; 
printf("Enter string to insert: "); 
scanf("%s",ele); 
addleft(s,ele,count); 

//following is the function definition 
void addleft(char *s[max],char *ele,int *count) 
{ 
    int i; 
    if((*count)==max) 
    { 
     printf("Queue full!\n"); 
     return; 
    } 
    for(i=*count;i>0;i--) 
     strcpy(s[i],s[i-1]); 
    strcpy(s[0],ele); 
    (*count)++; 
    printf("String inserted at left!\n"); 
} 
+3

我會改變標題爲「錯誤的代碼執行導致錯誤的輸入字符串處理」。這個標題聽起來像是你在爲輸入的字符串指定錯誤的代碼。 ;-) –

+0

對不起,我不關注標題。現在對我來說更重要的是我要提交這個to​​m的代碼:) – user1727119

回答

3

ele是一個未初始化的char*,也沒有與它scanf()將試圖寫它導致未定義的行爲相關的記憶,一個段錯誤是可能的。

您需要或者動態分配存儲器,用於ele或聲明一個局部陣列和防止緩衝器溢出使用scanf()時:

char ele[1024]; 
if (1 == scanf("%1023s", ele)) 
{ 
    /* Process 'ele'. */ 
} 

此外,功能addleft()s使用strcpy(),這是char*陣列並且陣列中的每個char*都是單元化的。這是未定義的行爲和可能的分段錯誤。要糾正,你可以使用strdup()如果可用,否則malloc()strcpy()

/* Instead of: 
     strcpy(s[0],ele); 
    use: 
*/ 
s[0] = strdup(ele); 

注意,for環路addleft()函數內部是危險的,因爲其中包含schar*不一定是相同的長度。這很容易導致寫入超出數組的末尾。但是,因爲元素是動態分配的地址char*,您可以交換元素而不是複製它們的內容。

0

sscanf(「%s」,ele)將輸入放在'ele'指向的內存中。但'ele'從未被初始化爲指向任何東西。喜歡的東西:

char ele[128]; 

char* ele = malloc(...) 

應該修復它。

-1

您正在導致緩衝區溢出,因爲指針ele未指向任何分配的內存。你正在寫入你的程序需要運行的內存,從而導致它崩潰。我建議你實現malloc到你的程序是這樣的:

char *ele; 
if (!(ele = malloc(50))) //allocate 50 bytes of memory 
{ 
    //allocation failed 
    exit(0); 
} 
scanf("%s", ele); //string can hold 50 bytes now 
free(ele);  //free allocated space 

你可能想在malloc功能讀了here

圖省事就只是爲了讓ele一個數組,而不是指針:

char ele[50]; //ele is an array of 50 bytes