动态数组和意外输出
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;
}
-
puntatoreI = &i;
正在分配一个指针 puntatoreI
以指向变量 i
。你不想那样做。你想修改 main
里面的变量 i
,也就是指针 puntatoreI
指向的地方。你想要:
*puntatoreI = i;
您正在为 p
分配 (i+1)
个字符。然而你分配给 p[i+1] = '[=19=]';
是访问 1 字节越界。就 p[i] = '[=20=]';
。 i
是 i+1
个元素数组中的最后一个索引。
在函数声明中使用空括号 char *fw();
已经很老了。为确保您的代码正常,只需重复定义 char *fw(char *parola, int *puntatoreI);
.
中的函数声明
&parola
的类型是 char (*)[30]
- 它是指向 30
字符数组的指针。然而,fw
函数采用 char *
- 指向 char 的指针。只需像 p = fw(parola, &i);
.
那样传递 parola
最后,对于你的问题:
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);
而不是整个循环。
我写了这个脚本,它的目的是输入一个短语并只打印第一个单词(第一个单词之前的单词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;
}
-
puntatoreI = &i;
正在分配一个指针
puntatoreI
以指向变量i
。你不想那样做。你想修改main
里面的变量i
,也就是指针puntatoreI
指向的地方。你想要:*puntatoreI = i;
您正在为
p
分配(i+1)
个字符。然而你分配给p[i+1] = '[=19=]';
是访问 1 字节越界。就p[i] = '[=20=]';
。i
是i+1
个元素数组中的最后一个索引。在函数声明中使用空括号
char *fw();
已经很老了。为确保您的代码正常,只需重复定义char *fw(char *parola, int *puntatoreI);
. 中的函数声明
&parola
的类型是char (*)[30]
- 它是指向30
字符数组的指针。然而,fw
函数采用char *
- 指向 char 的指针。只需像p = fw(parola, &i);
. 那样传递 最后,对于你的问题:
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);
而不是整个循环。
parola