2012-10-09 94 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