источник разрушения strncmp / strcpy - PullRequest
1 голос
/ 13 марта 2011

сегодня я пытался подружиться с символьной * строкой ... но мне кажется, что я не могу :) Каждый раз, когда я вызываю функцию 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 ]

3 голосов
/ 13 марта 2011

Вы возвращаете указатель на переменную стека.

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 do, do while, но не goto

2 голосов
/ 13 марта 2011
char * getString(int minChars, int maxChars)
{

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

Массив "string" здесь выделяется только для области действия функции getString ().Как только он возвращается (выходит из области видимости), он перестает существовать и будет перезаписан остальной частью вашей программы.Оператор return (string) возвращает указатель этих данных, которые больше не выделяются, а не сами данные.Это происходит из-за неявного преобразования массива в указатель в C.

Вместо этого ваша функция getString () должна принимать char * в качестве аргумента, который размещается в вызывающей функции.

1 голос
/ 13 марта 2011

Я вижу две проблемы с вашей функцией 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      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.
0 голосов
/ 13 марта 2011

240 строк - это не «фрагмент». Как предложил Джеймс в своем комментарии, уменьшите код до минимального количества строк, необходимых для воспроизведения проблемы. На этом этапе причина проблемы должна стать для вас очевидной, если не попытаться опубликовать ее снова.

...