动态数组和意外输出

我已经写了这个脚本,它的目的是输入一个短语并仅打印第一个单词(第一个空格之前的单词)。我不明白为什么在执行它时会在输出中得到很多数字。

#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;
}
dymd005 回答:动态数组和意外输出

  1. puntatoreI = &i;
    

    正在分配指针puntatoreI指向变量i。你不想那样做。您要修改i内的变量main,这就是指针puntatoreI指向的位置。您想要:

    *puntatoreI = i;
    
  2. 您正在为(i+1)分配p个字符。然而,您分配给p[i+1] = '\0';的是访问1字节超出范围。仅p[i] = '\0';ii+1元素数组中的最后一个索引。

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

  4. &parola的类型为char (*)[30]-它是指向30个字符数组的指针。但是,fw函数采用char *-指向char的指针。只需像parola中那样传递p = fw(parola,&i);

  5. 最后,您的问题:

    为什么执行它时,输出中会有很多数字。

    在输出上会出现“数字串”,因为您使用printf("%d",p[j]);打印它们。 %dprintf格式说明符,用于打印以10为基数的数字。要按原样打印字符,请使用%c格式说明符。但是因为p应该指向一个以零结尾的字符数组(指向一个字符串),所以您可以只执行printf("%s",p);而不是整个循环。

本文链接:https://www.f2er.com/2774740.html

大家都在问