1

今天我试图对 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

4 回答 4

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?请停止那个 - 使用for, while dodo while但不要goto

于 2011-03-12T23:36:41.277 回答
2
char * getString(int minChars, int maxChars)
{

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

这里的“字符串”数组只分配给 getString() 函数的作用域。一旦它返回(超出范围),它将不复存在,并将被您的程序的其余部分覆盖。“return(string)”语句返回不再分配的数据的指针——而不是数据本身。这是由于 C 中的隐式数组到指针转换。

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

于 2011-03-12T23:36:55.587 回答
1

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

  1. 必须声明字符串变量static,以便函数返回时不会释放(堆栈、弹出)用于它的内存。
  2. scanf() 的参数你不需要&令牌,而只是指向缓冲区的指针,string.

也就是说,更改行:

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

读书

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

您不想在scanf()调用中使用与号的原因是手册页中的以下内容man 3 scanf

      s 匹配一系列非空白字符;下一个
              指针必须是足够长的**指向字符数组**的指针
              保存输入序列和终止空字符
              ('\0'),它是自动添加的。输入字符串在
              空白或最大字段宽度,以发生者为准
              第一的。
于 2011-03-12T23:36:19.827 回答
0

240 行不是“片段”。正如 James 在他的评论中建议的那样,将代码减少到重现问题所需的最少行数。在那个阶段,问题的原因对您来说应该是显而易见的——如果不是,请尝试再次发布。

于 2011-03-12T23:47:18.523 回答