none
c++中怎样获取输入的一行长字符串然后存储在一个变量中? RRS feed

  • 问题

  • 
    
    

    我要在控制台上输入一行字符串(可以带空格的)。然后回车将输入的字符串赋值给一个变量,存储起来。

    目的是在实现一个文件系统的 写文件 操作,文件的内容在读文件操作的时候会显示出来。

    我用了getline函数,但是总是出错

    1.char str[FILE_LENGTH];

    2.cout<<"Please input the content"<<endl;

    3.cin.getline(str,FILE_LENGTH);

    我在另外一个地方写小程序测试的时候,将第2行的cout删掉,用cout<<str;输出字符串的内容运行正确,但是如果加上第2行那句就出错了。

    请大侠指点迷津,谢谢~


    新手上路,大神指点!

    2013年8月24日 10:28

答案

  • 无关风月,你好:

    我用你给的代码重现了个小程序,但是我没发现你说的问题。我把我重现你问题的小代码粘贴在下面

    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
         char str[100];
         cout<<"Please input the content"<<endl;
         cin.getline(str,100);
         cout<<str;
    	
        return 0;
    }
    

    这边我给你提供了一个关于getline函数使用的链接:http://msdn.microsoft.com/zh-cn/library/3ah895zy.aspx

    我们希望你可以提供我们更详细点的信息,以便我们更好的建议。


    Sunny Cao
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年8月26日 8:26
    版主

全部回复

  •        char str[FILE_LENGH];

           cout<<"please input the content"<<endl;

           int count = 0;

           while(cin.get(str[count] !='\n')

            {

                  count++;

              }

            str[count] = '\0';

           因为声明的是数组,最后的一个字符必须要为 ‘\0' 字符。

                  

          

           


    雷神

    2013年8月25日 12:12
  • 无关风月,你好:

    我用你给的代码重现了个小程序,但是我没发现你说的问题。我把我重现你问题的小代码粘贴在下面

    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
         char str[100];
         cout<<"Please input the content"<<endl;
         cin.getline(str,100);
         cout<<str;
    	
        return 0;
    }
    

    这边我给你提供了一个关于getline函数使用的链接:http://msdn.microsoft.com/zh-cn/library/3ah895zy.aspx

    我们希望你可以提供我们更详细点的信息,以便我们更好的建议。


    Sunny Cao
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年8月26日 8:26
    版主
  • 无关风月,你好:

    我用你给的代码重现了个小程序,但是我没发现你说的问题。我把我重现你问题的小代码粘贴在下面

    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
         char str[100];
         cout<<"Please input the content"<<endl;
         cin.getline(str,100);
         cout<<str;
    	
        return 0;
    }

    这边我给你提供了一个关于getline函数使用的链接:http://msdn.microsoft.com/zh-cn/library/3ah895zy.aspx

    我们希望你可以提供我们更详细点的信息,以便我们更好的建议。


    Sunny Cao
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.


    谢谢你~不过我在VS2010和Codeblock中都不能#include
    
    "stdafx.h"。请问int _tmain是什么形式的?是C++的吗

    新手上路,大神指点!

    2013年8月26日 12:58
  •        char str[FILE_LENGH];

           cout<<"please input the content"<<endl;

           int count = 0;

           while(cin.get(str[count] !='\n')

            {

                  count++;

              }

            str[count] = '\0';

           因为声明的是数组,最后的一个字符必须要为 ‘\0' 字符。

                  

          

           


    雷神


    谢谢~不过这句
    
    while(cin.get(str[count]) != '\n')总是编译不通过。类型似乎不匹配

    新手上路,大神指点!

    2013年8月26日 13:02
  • 无关风月,你好:

    我上面的代码是win32控制台程序,是在VS2010上运行的。int _tmain(int argc, _TCHAR* argv[]) {return 0;}这个是入口函数。你说的不能#include “stdafx.h”是怎样的呢。在新建好程序时,#include “stdafx.h”就自动出现在代码里了。


    Sunny Cao
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年8月27日 2:15
    版主
  • 无关风月,你好:

    我上面的代码是win32控制台程序,是在VS2010上运行的。int _tmain(int argc, _TCHAR* argv[]) {return 0;}这个是入口函数。你说的不能#include “stdafx.h”是怎样的呢。在新建好程序时,#include “stdafx.h”就自动出现在代码里了。


    Sunny Cao
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.


    VS2010?但是我一般新建项目后都是没有出现那个
    
    #include"stdafx.h"会不会是像楼上所说的是结尾要个结束符,可他的答复是错的

    新手上路,大神指点!

    2013年8月29日 1:53
  • 无关风月,你好:

    可能你新建的是一个空的win32控制台应用工程。

    我是这样建的工程:

    file->new project->Win32->Win32 Console Application

    给工程取个名字,然后点击“确定”。出现一个win32 application wizard的页面,

    点击“下一步”,出现如下页面

    按图中所示选择,最后点击完成。

    这样新建的工程就会有一些默认的.cpp文件和.h文件。你会看到一个类似于这样的页面。


    Sunny Cao
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年8月29日 5:35
    版主
  • 无关风月,你好:

    可能你新建的是一个空的win32控制台应用工程。

    我是这样建的工程:

    file->new project->Win32->Win32 Console Application

    给工程取个名字,然后点击“确定”。出现一个win32 application wizard的页面,

    点击“下一步”,出现如下页面

    按图中所示选择,最后点击完成。

    这样新建的工程就会有一些默认的.cpp文件和.h文件。你会看到一个类似于这样的页面。


    Sunny Cao
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    谢谢大侠!!我按你那个方法输入我上面的那段测试小程序就OK了。不过因为我是在做模拟Linux文件系统,所以代码比较多。我重新新建一个带编译头的项目后粘贴我的代码进去,运行总是跳过直接让我输入文件内容就执行下一句,输出“文件写入成功”。不知为啥 是不是因为在cin.getline前面已经输入过东西了?

    /*写文件*/
    int write_file()
    {
     char fileName[10];
     fnode *f = Fhead;
     
     cout<<"请输入您要写入文件的文件名:";
     cin>>fileName;
     while(f)
     {
      if(!strcmp(fileName,f->filename)) //找到此文件,跳出
       break;
      f = f->next;
     }
     if(f==NULL)
     {
      cout<<"当前目录下没有此文件!"<<endl;
      return 0;
     }
     if(f->protection == 0) //判断文件类型
     {
      cout<<"该文件为只读文件,写入失败!"<<endl;
      return 0;
     }
     
     f->openflag = 1; //文件标记为打开
     cout<<"---------------------------------写文件---------------------------------\n";
     cout<<"请输入文件内容:"<<endl;
     char str[MAX_FILESIZE];
     /*
     int count = 0;
        while(cin.get(str[count]) !='\n')
     {
          count++;
        }
        str[count] = '\0';
     */
     cin.getline(str,10);  //运行总是跳过直接让我输入文件内容就执行下一句,输出“文件写入成功”
     
     //system("pause"); 
     if(strlen(str) > MAX_FILESIZE || strlen(str) > f->length)
     {
      cout<<"写入字符串长度大于该文件的总长度,写入失败\n";
      return 0;
     }

     //strcpy(f->content,str);
     f->length = strlen(str);
     cout<<"文件写入成功\n";
     return 1;

    }


    新手上路,大神指点!

    2013年8月31日 1:37