代码改变世界

C++中的输入参考

2016-08-20 11:13  shuaihanhungry  阅读(1030)  评论(0编辑  收藏  举报

1、输入输出
1)operator>>

参考:cplusplus.com

Extracts characters from is and stores them in s as a c-string, stopping as soon as either a whitespace character is encountered or (width()-1) characters have been extracted (if width is not zero).
A null character (charT()) is automatically appended to the written sequence.
Internally, the function accesses the input sequence of is by first constructing a sentry with noskipws set to false: this may flush its tied stream and/or discard leading whitespaces (see istream::sentry).

// example on extraction
#include <iostream>     // std::cin, std::cout

int main () {
  char str[10];

  std::cout << "Enter a word: ";
  std::cin.width (10);               // limit width
  std::cin >> str;
  std::cout << "The first 9 chars of your word are: " << str << '\n';

  return 0;
}

2)getline()

参考:cplusplus.com

Extracts characters from is and stores them into str until the delimitation character delim is found.
Note that any content in str before the call is replaced by the newly extracted sequence.

参考:cppreference.com

When used immediately after whitespace-delimited input, e.g. after int n; std::cin >> n;, getline consumes the endline character left on the input stream by operator>>, and returns immediately. A common solution is to ignore all leftover characters on the line of input with cin.ignore(std::numeric_limitsstd::streamsize::max(), '\n'); before switching to line-oriented input.

#include <iostream>
#include <string> 
using namespace std;

int main() 
{ 
   cout << "Please enter an integer: ";
   int number;
   cin >> number; // put user input in number

   cout << "What is your name? ";
   cin.ignore(); // Don't use getline after cin >> without using ignore!
   string name;
   getline(cin, name, '\n'); // put user input in name

   cout << "Thank you, " << name << ". " << endl;
   cout << "Your number is " << number << "." << endl;

   return 0;  
}

3)cin.getline()

参考:cplusplus.com

The delimiting character is the newline character ('\n') for the first form, and delim for the second: when found in the input sequence, it is extracted from the input sequence, but discarded and not written to s.
A null character ('\0') is automatically appended to the written sequence if n is greater than zero, even if an empty string is extracted.

参考:cppreference.com

Extracts characters from stream until end of line or the specified delimiter delim.

// istream::getline example
#include <iostream>     // std::cin, std::cout

int main () {
  char name[256], title[256];

  std::cout << "Please, enter your name: ";
  std::cin.getline (name,256);

  std::cout << "Please, enter your favourite movie: ";
  std::cin.getline (title,256);

  std::cout << name << "'s favourite movie is " << title;

  return 0;
}

注意,cin.getline()属于istream流,而getline()属于string流,getline()的第一个参数是cin,两个函数是不一样的;它们也有共同点,即都可以有第3个用于分隔的参数(默认是'\n')。

详细请参考:Tips and tricks for using C++ I/O (input/output)C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

2、基本类型与字符串之间的转换
1)itoa()

参考:cplusplus.com

Converts an integer value to a null-terminated string using the specified base and stores the result in the array given by str parameter.
This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.

/* itoa example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
  int i;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  itoa (i,buffer,10);
  printf ("decimal: %s\n",buffer);
  itoa (i,buffer,16);
  printf ("hexadecimal: %s\n",buffer);
  itoa (i,buffer,2);
  printf ("binary: %s\n",buffer);
  return 0;
}

2)atof(), atoi(), atol()

/* atoi example */
#include <stdio.h>      /* printf, fgets */
#include <stdlib.h>     /* atoi */

int main ()
{
  int i;
  char buffer[256];
  printf ("Enter a number: ");
  fgets (buffer, 256, stdin);
  i = atoi (buffer);
  printf ("The value entered is %d. Its double is %d.\n",i,i*2);
  return 0;
}

3)itoa()区别于iota()

// iota example
#include <iostream>     // std::cout
#include <numeric>      // std::iota

int main () {
  int numbers[10];

  std::iota (numbers,numbers+10,100);

  std::cout << "numbers:";
  for (int& i:numbers) std::cout << ' ' << i;
  std::cout << '\n';

  return 0;
}

4)strtod(), strtol()

参考:cplusplus.com

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes as many characters as possible that are valid following a syntax that depends on the base parameter, and interprets them as a numerical value. Finally, a pointer to the first character following the integer representation in str is stored in the object pointed by endptr.

/* strtol example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* strtol */

int main ()
{
  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
  char *pEnd;
  long int li1, li2, li3, li4;
  li1 = strtol (szNumbers,&pEnd,10);
  li2 = strtol (pEnd,&pEnd,16);
  li3 = strtol (pEnd,&pEnd,2);
  li4 = strtol (pEnd,NULL,0);
  printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
  return 0;
}

注意,itoa()与strtol()需要一个参数作为转换的基数。

4)sprintf()

参考:cplusplus.com

Composes a string with the same text that would be printed if format was used on printf, but instead of being printed, the content is stored as a C string in the buffer pointed by str.
On success, the total number of characters written is returned. This count does not include the additional null-character automatically appended at the end of the string.

/* sprintf example */
#include <stdio.h>

int main ()
{
  char buffer [50];
  int n, a=5, b=3;
  n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
  printf ("[%s] is a string %d chars long\n",buffer,n);
  return 0;
}

5)sscanf()

Reads data from s and stores them according to parameter format into the locations given by the additional arguments, as if scanf was used, but reading from s instead of the standard input (stdin).
On success, the function returns the number of items in the argument list successfully filled. This count can match the expected number of items or be less (even zero) in the case of a matching failure.

/* sscanf example */
#include <stdio.h>

int main ()
{
  char sentence []="Rudolph is 12 years old";
  char str [20];
  int i;

  sscanf (sentence,"%s %*s %d",str,&i);
  printf ("%s -> %d\n",str,i);
  
  return 0;
}

3、分隔字符串
1)strtok()

参考:cppreference.com

Finds the next token in a null-terminated byte string pointed to by str. The separator characters are identified by null-terminated byte string pointed to by delim.
This function is designed to be called multiples times to obtain successive tokens from the same string.

参考:cplusplus.com

This end of the token is automatically replaced by a null-character, and the beginning of the token is returned by the function.
Once the terminating null character of str is found in a call to strtok, all subsequent calls to this function (with a null pointer as the first argument) return a null pointer.

#include <cstring>
#include <iostream>
 
int main() 
{
    char input[100] = "A bird came down the walk";
    char *token = std::strtok(input, " ");
    while (token != NULL) {
        std::cout << token << '\n';
        token = std::strtok(NULL, " ");
    }
}

注意,该函数第一次调用时的参数和以后调用的参数是不同的,它可以搭配cin.getline()一起使用。

2)istringstream, ostringstream, stringstream
stringstream同时具有前两者的功能。

假设输入为

数据结构为

先用istringstream处理

再用ostringstream处理

3)string::find()

void split(const string& str, char delimiter, vector<string>& result) {
    auto i = 0;
    auto pos = str.find(delimiter);
    while (pos != string::npos) {
      result.push_back(str.substr(i, pos-i));
      i = ++pos;
      pos = str.find(delimiter, pos);

      if (pos == string::npos)
         result.push_back(str.substr(i, str.length()));
    }
}

详细请参考:Split a string using C++C++常见问题: 字符串分割函数 split

注意,istringstream和stringstream可以搭配getline()一起使用。