Dynami c массивы и неожиданный вывод - PullRequest
0 голосов
/ 14 января 2020

Я написал этот скрипт, и его цель - ввести фразу и напечатать только первое слово (перед первым пробелом). Я не могу понять, почему, когда я выполняю это, я получаю кучу чисел в выводе.

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

#define MAX 30

/*
Prende in input una frase e stampa la prima parola
*/
char *fw();

int main () {

    int j,i;
    char parola[MAX], *p;

    printf ("Inserisci una stringa: ");
    fgets(parola, MAX, stdin);

    p = fw(&parola, &i);

    for (j=0; j < i; j++){
        printf("%d", p[j]);
    }

    return 0;
}

char *fw(char *parola, int *puntatoreI) {

    int i;
    char *p;

    for (i=0; parola[i]!=' '; i++)
        ;

    p = (char *)malloc((i+1)*sizeof(char));

    for (i=0; parola[i]!=' '; i++){
        p[i] = parola[i];
    }
    p[i+1] = '\0';

    puntatoreI = &i;

    return p;
}

1 Ответ

4 голосов
/ 14 января 2020
  1. puntatoreI = &i;
    

    Назначает ли указатель puntatoreI для указания переменной i. Ты не хочешь этого делать. Вы хотите изменить переменную i внутри main, на которую указывает указатель puntatoreI. Вы хотите:

    *puntatoreI = i;
    
  2. Вы выделяете (i+1) символов для p. Тем не менее, вы назначаете для p[i+1] = '\0'; доступ к 1 байту за пределами. Просто p[i] = '\0';. i - последний индекс в массиве из i+1 элементов.

  3. Использование пустых скобок в объявлении функции char *fw(); очень устарело. Чтобы убедиться, что ваш код в порядке, просто повторите объявление функции из определения char *fw(char *parola, int *puntatoreI);.

  4. Тип &parola равен char (*)[30] - это указатель на массив 30 символов. Тем не менее, функция fw принимает char * - указатель на символ. Просто передайте parola, как в p = fw(parola, &i);.

  5. И, наконец, на ваш вопрос:

    , почему при выполнении я получаю кучу чисел на выходе.

    Вы получите «кучу чисел» на выходе, потому что вы печатаете их с printf("%d",p[j]);. %d - это спецификатор формата printf, используемый для печати чисел в базе 10. Для печати символов, как они есть, используйте спецификатор формата %c. Но так как p должен указывать на массив символов с нулем в конце (на строку), вы можете сделать просто printf("%s", p); вместо целого l oop.

...