Почему printf оставляет некоторые случайные символы в основной функции? [C программа] - PullRequest
2 голосов
/ 27 марта 2020

Я хочу получить информацию о ком-либо в функции getInfo.

Если я печатаю имя , когда я IN , функция getInfo, она печатает ее правильно, но после этого в основном он оставляет несколько случайных символов.

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

char* getLine(){
    char *line = malloc(256);
    fgets(line, 256, stdin);
    if ((strlen(line) > 0) && (line[strlen (line) - 1] == '\n'))
        line[strlen (line) - 1] = '\0';
    return line;
}

void getInfo(char* name,char* place,char* days[]){
    printf("Type in your name:\n");
    name = getLine();

    printf("%s",name);                      // <---- THIS PRINTS OUT CORRECTLY
}

int main( int argc, const char* argv[] )
{
    char* name = (char*)malloc(100*sizeof(char));
    char* place = (char*)malloc(100*sizeof(char));
    char* days[5];

    getInfo(name,place,days);

    printf("%s\n",name);                   // <----- THIS LEAVES SOME CHARACTERS
}

ВЫХОД:

C:\Users\Felhasznalo\Desktop>a.exe
Type in your name:
Peter Smith
Peter Smith`\┴

Эти символы "\ \" Я говорю о. Первый отпечаток в функции печатает его хорошо, но в основном он дает эти символы-призраки.

Почему они записаны? Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Проблема в том, что вы заменяете указатель 'name', который ваша функция main передает getInfo(). Это связано с тем, что getInfo() вызывает getLine(), который сам создает массив символов new и возвращает указатель на этот буфер в getInfo().

Внутри getInfo(), это напечатано правильно (как вы заметили); однако функция main передает копию указателя name (т. е. по значению ) - и эта функция не может (не может быть изменена) функцией getInfo. Итак, в main вы распечатываете неинициализированный массив символов (name).

Существует несколько способов исправить это. Можно было бы передать аргумент (ы) name (и, предположительно, place) getInfo() в качестве указателя на указатель , когда вам нужно будет отменить ссылку внутри этого функция; например:


void getInfo(char** name, char** place, char* days[])
{
    printf("Type in your name:\n");
    *name = getLine();
    printf("%s", *name);
}

Затем в вашем main вам: (a) не нужно выделять память для nameplace), как это делает * Функция 1035 *; (b) передать адрес указателя name на getInfo(). Вот так, например:

int main(int argc, const char* argv[])
{
    char* name;// = (char*)malloc(100 * sizeof(char));
    char* place;// = (char*)malloc(100 * sizeof(char));
    char* days[5]; // Don't know what you want to do with this!
    getInfo(&name, &place, days);
    printf("%s\n", name);
    // Don't forget to free the allocated buffers:
    free(name);
//  free(place);
    return 0;
}

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

0 голосов
/ 27 марта 2020

name = getLine(); в getInfo() не влияет на name в main().

Попробуйте вернуть name из getinfo() и в main() назначить char *name = getline(...).


В стороне: альтернативный код для getline()

char* getLine(){
  char buffer[256];
  if (fgets(buffer, sizeof buffer, stdin) == NULL) {
    return NULL;
  }
  size_t len = strlen(buffer);
  if (len > 0 && buffer[len - 1] == '\n') {
    buffer[--len] = '\0';
  }
  char *line = malloc(len + 1);
  if (line) {
    memcpy(line, buffer, len + 1);
  }
  return line;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...