Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将字符串传递到函数中_C_String_Io - Fatal编程技术网

C 将字符串传递到函数中

C 将字符串传递到函数中,c,string,io,C,String,Io,我试图将一个字符串传递到C中的函数中。该字符串将由用户输入,然后传递到函数以写入文本文件。我知道这似乎很基本,但我只是在学习C #include <stdio.h> #include <string.h> void read() { char text[50][30],buffer[150]; int i=0; FILE *file_in; file_in=fopen("test.txt","r");

我试图将一个字符串传递到C中的函数中。该字符串将由用户输入,然后传递到函数以写入文本文件。我知道这似乎很基本,但我只是在学习C

#include <stdio.h>
#include <string.h>

void read() {

        char text[50][30],buffer[150];

        int i=0;
        FILE *file_in;
        file_in=fopen("test.txt","r");

        if (file_in == NULL) {
                printf("Error opening file\n");
        }

        while (fgets(buffer,150,file_in)) {
                strcpy(text[i],buffer);
                printf("line %d: %s\n",i,text[i]);
                i++;
        }

        getchar();

        fclose(file_in);
}

void write(char str[])
{
        FILE *file_in;
        file_in=fopen("test.txt","a");

        if (file_in == NULL) {
                printf("Error opening file\n");
        }

        //write to the file
        fprintf(file_in, "\n%s", str);
//      fputs(str, file_in);

        fclose(file_in);
}

int main()
{
        read();

        char msg[50];

        printf("Enter some text: ");
        puts(msg);

        write(msg); 

        return 0;
}
#包括
#包括
无效读取(){
字符文本[50][30],缓冲区[150];
int i=0;
文件*FILE_in;
文件_in=fopen(“test.txt”、“r”);
if(file_in==NULL){
printf(“打开文件时出错”);
}
而(fgets(缓冲区,150,文件_in)){
strcpy(文本[i],缓冲区);
printf(“第%d行:%s\n”,i,文本[i]);
i++;
}
getchar();
fclose(文件输入);
}
无效写入(字符str[])
{
文件*FILE_in;
文件_in=fopen(“test.txt”、“a”);
if(file_in==NULL){
printf(“打开文件时出错”);
}
//写入文件
fprintf(文件在“\n%s”,str中);
//FPUT(str,文件中);
fclose(文件输入);
}
int main()
{
read();
半焦味精[50];
printf(“输入一些文本:”);
放(味精);
写(msg);
返回0;
}

它会写入文件,但会写入奇怪的字符,而不是我实际键入的字符。amI做错了什么?

首先:不要调用函数
read()
write()
-选择更具体的函数。系统已将函数名
read()
write()
用于低级文件操作,尝试自己定义它们将导致意外行为


第二:您从不初始化
msg
变量的内容,也不向其中读取任何数据,因此其内容将是随机的。(请记住,
put()
打印数据;它不读取任何内容。)

看起来您将
获取
放置
混淆了
put
将字符串写入控制台<代码>获取从控制台读取字符串。把它们关掉,你的程序就可以运行了

Microsoft的编译器经常警告不要使用不安全或不推荐使用的函数,如
get
。您可以改用
fgets
,因为它不允许缓冲区溢出

下面是一个例子:

fgets(msg, 50, stdin);


当你写
charmsg[50],它包含不确定的值。它不是零初始化的或任何东西

put(msg)
line将这个垃圾写出来,然后
write(msg)将垃圾写入文件

我猜您打算在
printf
之后和
put
之前输入一些文本代码

注意。在
read()
函数(您还没有调用该函数)中,应该使
fgets
缓冲区大小与数组的宽度匹配,并且应该检查如果文件有多行,是否没有从数组末尾运行

此外,明智的做法是将函数命名为非
read
write
,因为在POSIX环境中,已经有使用该名称的函数可能发生冲突。

以下是解决方案:

#include <stdio.h>
#include <string.h>

int read() {

        char text[50][30],buffer[150];

        int i=0;
        FILE *file_in;
        file_in=fopen("test.txt","r");

        if (file_in == NULL) {
                printf("Error opening file\n");
        }

        while (fgets(buffer,150,file_in)) {
                strcpy(text[i],buffer);
                printf("line %d: %s\n",i,text[i]);
                i++;
        }

       // getchar();why you were using this?

        fclose(file_in);
      //  return 0;
}

void write(char str[])
{
        FILE *file_in;
        file_in=fopen("test.txt","a");

        if (file_in == NULL) {
                printf("Error opening file\n");
        }

        //write to the file
        fprintf(file_in, "\n%s", str);
//      fputs(str, file_in);

        fclose(file_in);
}

int main()
{
        char msg[50];
        read();



        printf("Enter some text: ");
       // getchar();
        gets(msg);//It reads in msg 

        write(msg); 

        return 0;
}
#包括
#包括
int read(){
字符文本[50][30],缓冲区[150];
int i=0;
文件*FILE_in;
文件_in=fopen(“test.txt”、“r”);
if(file_in==NULL){
printf(“打开文件时出错”);
}
而(fgets(缓冲区,150,文件_in)){
strcpy(文本[i],缓冲区);
printf(“第%d行:%s\n”,i,文本[i]);
i++;
}
//getchar();为什么要使用此选项?
fclose(文件输入);
//返回0;
}
无效写入(字符str[])
{
文件*FILE_in;
文件_in=fopen(“test.txt”、“a”);
if(file_in==NULL){
printf(“打开文件时出错”);
}
//写入文件
fprintf(文件在“\n%s”,str中);
//FPUT(str,文件中);
fclose(文件输入);
}
int main()
{
半焦味精[50];
read();
printf(“输入一些文本:”);
//getchar();
获取(msg);//它读取msg
写(msg);
返回0;
}

它写了什么?类似0x049569的东西…?我写的东西像一个盒子,里面有很多字符。请在你的问题中发布它打印的内容。你从不在
msg
中存储值,因此它包含垃圾。我试图将输出粘贴到这里,但粘贴时它实际上不会显示在这里。当我在vim编辑器上查看该文件时,它显示为^A。当我在gedt上打开它时,它显示为垃圾。你只是建议某人使用
gets
?我厌倦了使用gets。它工作了,但它说它不推荐使用。有更好的方法吗?@TaylorFlores:不适合文本输入
fread
将读取指定数量的字节,这意味着它不会在行尾停止(键入Enter时)。使用
fgets
@flaco我将我的建议更改为
fgets
感谢您的解决方案您的欢迎..我没有提供更改。你应该浏览其他答案,不要使用gets-use fgets,而应该使用fgets-use fgets。这个答案的投票人应该留下一个理由。i、 e.poster对SO来说相当陌生,请告诉他如何改进答案。@jahan-关于您的评论//getchar();你为什么用这个?。在控制台应用程序中,
getchar()
是一种暂停执行的好方法,这样您可以在执行崩溃控制台之前看到
printf()
的输出。@ryker谢谢您告诉我这一点。你知道有些人沉迷于投票。
#include <stdio.h>
#include <string.h>

int read() {

        char text[50][30],buffer[150];

        int i=0;
        FILE *file_in;
        file_in=fopen("test.txt","r");

        if (file_in == NULL) {
                printf("Error opening file\n");
        }

        while (fgets(buffer,150,file_in)) {
                strcpy(text[i],buffer);
                printf("line %d: %s\n",i,text[i]);
                i++;
        }

       // getchar();why you were using this?

        fclose(file_in);
      //  return 0;
}

void write(char str[])
{
        FILE *file_in;
        file_in=fopen("test.txt","a");

        if (file_in == NULL) {
                printf("Error opening file\n");
        }

        //write to the file
        fprintf(file_in, "\n%s", str);
//      fputs(str, file_in);

        fclose(file_in);
}

int main()
{
        char msg[50];
        read();



        printf("Enter some text: ");
       // getchar();
        gets(msg);//It reads in msg 

        write(msg); 

        return 0;
}