#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *in()
{
char *a[100];
scanf("%s",&a);
printf("\na : %d",&a);
return(a);
}
int main()
{
char *b;
int i,j;
FILE *fp;
fp=fopen("asif.txt","w");
b=in();
printf("\nb : %d",b);
for(j=0;j<strlen(b);j++)
{
putc(b[j],fp);
}
fclose(fp);
return 0;
}
答案 0 :(得分:1)
您似乎对C语法有一些基本的误解,这些误解会给您带来问题,例如:
char *in()
{
char *a[100];
scanf("%s",&a);
printf("\na : %d",&a);
return(a);
}
char *a[100];
宣布'array or pointers to char'
(100
他们)in
内被声明为local,因此当函数in
返回时将被销毁(函数stack-frame在那时被销毁/释放)。'array or pointers to char'
,您需要一个足够大的character-array
来保持读取的最长字作为输入,或者您需要分配相同大小的内存块(提供最后 nul-terminatedating 字符的空格)printf("\na : %d",&a)
尝试使用 decimal 格式说明符打印指针数组的地址。如果您尝试打印指针地址,请使用%p
。%s
来打印字符串。a
之前使用运算符的地址。in
声明为类型char *
,但然后尝试返回类型char *[100]
- 您的编译器应该喷出警告和错误(阅读它们,您可以从阅读中学到更多C和消除所有警告和错误,而不是其他任何地方)使in
作为参数传递FILE *fp
更有用,并在函数中使用fscanf
以允许从任何文件中读取。只需通过stdin
即可阅读标准输入。
您还需要将足够大小的字符数组传递给in
。在b
中为main
提供存储并将其作为参数传递给in
,这就是您打算做的事情。 (您还可以使用in
,malloc
或calloc
在realloc
内动态分配内存,但您有责任free
分配任何内存。最好只在b
中为main
创建存储空间并将其传递给in
。
将它们放在一起,看起来你想要的东西类似于以下内容:
#include <stdio.h>
#define MAX 100 /* longest word in the unabridged dictionary is 27-chars */
char *in (FILE *fp, char *a)
{
if (fscanf (fp, "%99s", a) != EOF) { /* always validate ALL input */
printf ("a : %s\n", a);
return(a);
}
else
return NULL; /* return NULL on EOF to indicate done reading */
}
int main (void)
{
char b[MAX] = ""; /* declare b with 100 chars and initialize */
FILE *fp;
if (!(fp = fopen ("asif.txt","w"))) { /* validate ALL file openingings */
fprintf (stderr, "error: file open failed 'asif.txt'.\n");
return 1;
}
while (in (stdin, b)) /* for each word in input */
fprintf (fp, "%s", b); /* write it to output file */
fclose(fp); /* close file */
return 0;
}
示例输入
$ cat data.txt
Abbie 3.4 Oakley 3.5 Sylvia 3.6 Uwe 3.7 Ken 3.8 Aaron 3.9 Fabien 4
示例使用/输出
$ ./bin/fprintftofile <dat/data.txt
a : Abbie
a : 3.4
a : Oakley
a : 3.5
a : Sylvia
a : 3.6
a : Uwe
a : 3.7
a : Ken
a : 3.8
a : Aaron
a : 3.9
a : Fabien
a : 4
文件输出
$ cat asif.txt
Abbie3.4Oakley3.5Sylvia3.6Uwe3.7Ken3.8Aaron3.9Fabien4
(注意:您没有在写入'asif.txt'
或包含任何'\n'
s的字词之间放置任何空格
仔细看看并告诉我您是否有任何问题,或者您的意图与我的意图有所不同。
注意:始终在启用警告的情况下进行编译(例如,在编译字符串中使用-Wall -Wextra
),并且在编译时没有警告或错误,不接受代码。
答案 1 :(得分:0)