将字符串传递给函数

时间:2014-05-09 23:57:03

标签: 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");

        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;
}

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

4 个答案:

答案 0 :(得分:2)

您似乎已将getsputs混淆了。 puts将一个字符串写入控制台。 gets从控制台读取一个字符串。切换出来,你的程序应该可以工作。

Microsoft的编译器经常警告不安全或弃用的函数,例如gets。您可以使用fgets代替,因为它不允许缓冲区溢出。

以下是一个例子:

fgets(msg, 50, stdin);

fgets(msg, sizeof(msg), stdin);

答案 1 :(得分:0)

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

第二:你永远不会初始化msg变量的内容或读取任何数据,因此其内容将是随机的。 (请记住puts()打印数据;它没有读取任何内容。)

答案 2 :(得分:0)

当您编写char msg[50];时,它包含不确定的值。它不是零初始化或任何东西。

puts(msg);行写出这个垃圾,然后write(msg);将垃圾写入文件。

我想您打算在printf之后和puts之前输入一些代码来输入文字。

NB。在您的read()功能中(您还没有打电话),您应该使fgets缓冲区大小与阵列的宽度相匹配,并且您应该检查您是否已经跑掉如果文件有很多行,则为数组的结尾。

同样明智的做法是将函数命名为readwrite之外的其他函数,因为在POSIX环境中,已存在可能发生冲突的函数。

答案 3 :(得分:-1)

以下是解决方案:

#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;
}