动态数组和意外输出

Dynamic arrays and unexpected output

我写了这个脚本,它的目的是输入一个短语并只打印第一个单词(第一个单词之前的单词space)。我不明白为什么,当我执行它时,我在输出中得到一堆数字。

#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] = '[=10=]';

    puntatoreI = &i;

    return p;
}
  1. puntatoreI = &i;
    

    正在分配一个指针 puntatoreI 以指向变量 i。你不想那样做。你想修改 main 里面的变量 i,也就是指针 puntatoreI 指向的地方。你想要:

    *puntatoreI = i;
    
  2. 您正在为 p 分配 (i+1) 个字符。然而你分配给 p[i+1] = '[=19=]'; 是访问 1 字节越界。就 p[i] = '[=20=]';ii+1 个元素数组中的最后一个索引。

  3. 在函数声明中使用空括号 char *fw(); 已经很老了。为确保您的代码正常,只需重复定义 char *fw(char *parola, int *puntatoreI);.

  4. 中的函数声明
  5. &parola 的类型是 char (*)[30] - 它是指向 30 字符数组的指针。然而,fw 函数采用 char * - 指向 char 的指针。只需像 p = fw(parola, &i);.

  6. 那样传递 parola
  7. 最后,对于你的问题:

    why when I execute it I get a bunch of numbers in output.

    你在输出中得到一个 "bunch of numbers",因为你用 printf("%d",p[j]); 打印它们。 %d 是一个 printf 格式说明符,用于以 10 为基数打印数字。要按原样打印字符,请使用 %c 格式说明符。但是因为 p 应该指向一个以零结尾的字符数组(指向一个字符串),你可以只做 printf("%s", p); 而不是整个循环。