动态数组意外输出

问题描述 投票:0回答:1

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

#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;
} ```
c c99
1个回答
0
投票
    1。

puntatoreI = &i;

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

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

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

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

  4. 最后,您的问题:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.