嗨,我已经写了这个脚本,它的目的是输入一个短语并只打印第一个单词(第一个空格之前的单词),我不明白为什么我执行它时会得到很多数字在输出中。
#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;
} ```
puntatoreI = &i;
正在分配指针puntatoreI
指向变量i
。你不想那样做。您要修改i
内部的变量main
,也就是指针puntatoreI
指向的位置。您想要:
*puntatoreI = i;
您正在为(i+1)
分配p
个字符。但是,您分配给p[i+1] = '\0';
的是访问1字节超出范围。只是p[i] = '\0';
。 i
是i+1
元素数组中的最后一个索引。
在函数声明char *fw();
中使用空括号非常老。要确保您的代码正常,只需从定义char *fw(char *parola, int *puntatoreI);
重复函数声明即可。
&parola
的类型为char (*)[30]
-它是30
字符数组的指针。但是,fw
函数采用char *
-指向char的指针。只需像在parola
中那样传递p = fw(parola, &i);
。
最后,您的问题:
为什么执行它时,输出中会有很多数字。
您会在输出上看到“数字串”,因为使用printf("%d",p[j]);
打印它们。 %d
是用于打印以10为基数的数字的printf
格式说明符。要按原样打印字符,请使用%c
格式说明符。但是因为p
应该是一个零终止的字符串,所以您可以只执行printf("%s", p);
而不是整个循环。