【问题标题】:passing a string into a function将字符串传递给函数
【发布时间】:2014-05-09 23:57:02
【问题描述】:

我正在尝试将字符串传递给 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;
}

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

【问题讨论】:

  • 它写了什么?像 0x049569...?
  • 我写了一个像盒子一样的东西,里面有很多字符。
  • 请在您的问题中发布它打印的内容
  • 你永远不会在msg中存储一个值,所以它包含垃圾。
  • 我尝试将输出粘贴到此处,但是当我粘贴它时,它实际上并没有显示在此处。当我查看 vim 编辑器上的文件时,它显示为 ^A。当我在 gedt 上打开它时,它显示为垃圾

标签: c string io


【解决方案1】:

您似乎将getsputs 混淆了。 puts 将字符串写入控制台。 gets 从控制台读取一个字符串。把它们关掉,你的程序应该可以工作了。

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

这是一个例子:

fgets(msg, 50, stdin);

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

【讨论】:

  • 你是不是建议别人使用gets
  • 我厌倦了使用gets。它工作但它说它已被弃用。有没有更好的办法?
  • @TaylorFlores:不适用于文本输入。 fread 将读取指定数量的字节,这意味着它不会在行尾停止(当您键入 Enter 时)。使用fgets
  • @flaco 我把我的建议改成了fgets
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    我猜您打算在printf 之后和puts 之前添加一些用于输入文本的代码。

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

    另外,最好将您的函数命名为 readwrite 以外的其他名称,因为在 POSIX 环境中已经存在使用该名称的函数可能会发生冲突。

    【讨论】:

      【解决方案4】:

      解决办法如下:

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

      【讨论】:

      • 欢迎您..我没有提供更改。您应该查看其他答案,不要使用gets,而是使用fgets。
      • 这个答案的反对者应该真的留下一个理由。即海报对 SO 来说是相当新的,让他知道如何改进答案。
      • @jahan - 关于你的评论 // getchar();你为什么使用这个?。在控制台应用程序中,getchar() 是暂停执行的好方法,因此您可以在执行折叠控制台之前看到 printf() 的输出。
      • @ryyker 谢谢你告诉我。你知道有些人喜欢在这里投反对票。
      猜你喜欢
      • 2016-01-28
      • 2013-12-11
      • 1970-01-01
      • 2011-05-12
      • 2016-12-08
      • 2018-01-15
      相关资源
      最近更新 更多