strncmp / strcpy腐败源

时间:2011-03-12 23:30:13

标签: c strcpy

今天我试图用char *字符串友好...但似乎我失败了:) 每当我调用strcmp / strncmp / strcpy函数时,我的源代码都会被破坏......

这是片段

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

struct student
{
    int UID;
    char name[20];
    char surname[20];
};

char * getString(int minChars, int maxChars);

struct student * myStud;

int main(int argc, char** argv) {

    myStud = (struct student*)malloc(sizeof(struct student));
    while(1)
    {
        printf("\nEnter new name: ");
        strcpy(myStud->name,getString(1,19));
        printf("\n The values is now %s",myStud->name);
    }
    return (EXIT_SUCCESS);
}

char * getString(int minChars, int maxChars)
{

    char string[maxChars+1];
scanAgain:
    scanf("%s",&string);
    if(strlen(string)<minChars)
    {
        printf("\nToo few symbols, try again: ");
        goto scanAgain;
    }
    if(strlen(string)>maxChars)
    {
        printf("\nToo many symbols, try again: ");
        goto scanAgain;
    }
    string[maxChars]='\0';
    return(string);
}

输出:

Enter new name: Alekasdasd

 The values is now Alekasda�#
Enter new name: 

我只是一个初学者,所以它可能是非常简单的......可能不是。 哦顺便说一句,使用linux和netbeans作为SDK,gcc作为编译器。

4 个答案:

答案 0 :(得分:3)

您正在返回指向堆栈变量的指针。

char * getString(int minChars, int maxChars)
{

    char string[maxChars+1];

当getString返回时,string无效。您的返回值指向此无效字符串。

使用:

char * getString(int minChars, int maxChars, char * string) {

    return string;
}
...
char string[100];
getString(1, 2, string);

另外,goto?请停止 - 使用forwhile dodo while但不是goto

答案 1 :(得分:2)

char * getString(int minChars, int maxChars)
{

    char string[maxChars+1];
    ...
    return(string);
}

此处的“string”数组仅分配给getString()函数的范围。一旦它返回(超出范围),它就不再存在,并将被你的程序的其余部分覆盖。 “return(string)”语句返回此数据的指针,不再分配 - 而不是数据本身。这是由于C中的隐式数组到指针转换而发生的。

而不是这样做,你的getString()函数应该将char *作为参数,它在调用函数中分配。

答案 2 :(得分:1)

我发现你的getString()函数存在两个问题:

  1. 字符串变量必须声明为static,以便在函数返回时不会释放(堆栈,弹出)用于它的内存。
  2. scanf()的参数您不需要&标记,而只需要指向缓冲区的指针string
  3. 即改变行:

    char string[maxChars+1];
    scanf("%s",&string);
    

    阅读

    static char string[maxChars+1];
    scanf("%s",string);
    

    您不希望在scanf()调用中使用“&”符号的原因如下所示:手册页man 3 scanf

          s      Matches a  sequence  of  non-white-space  characters;  the  next
                  pointer must be a **pointer to character array** that is long enough
                  to hold the input sequence and the  terminating  null  character
                  ('\0'), which is added automatically.  The input string stops at
                  white space or at the  maximum  field  width,  whichever  occurs
                  first.
    

答案 3 :(得分:0)

240行不是“片段”。 正如詹姆斯在评论中建议的那样,将代码减少到重现问题所需的最小行数。在那个阶段,问题的原因应该对你来说很明显 - 如果不是再尝试发布。