【问题标题】:C++ read number string and capture specific position character as intC ++读取数字字符串并将特定位置字符捕获为int
【发布时间】:2016-03-15 18:53:21
【问题描述】:

我需要我的程序读取用户输入的一串数字,然后将每个数字分配给一个 int 变量:

94715 是用户输入的字符串

然后

a=9
b=4
c=7
d=1
e=5

所以我可以

if (a < b),  c*d+e, a-e, etc

我已经搜索了一些命令(getline、string.substr(ind,n)、getc、fgetc、atoi 等)我知道我很接近但我找不到我正在寻找的确切示例.

我找到的最简单最直接的方法是

stringstream convert(string1);
convert>>variable; 

但它会转换整个字符串,如果有办法在其中添加一个 ind 位置,比如

string1.substr(0,1)

这样就行了……

【问题讨论】:

  • 所以数字应该是个十进制数字?记住char c = '0'; c - '0' == 0.
  • 输入有限制吗?例如,用户必须准确输入 5 位数字等...
  • 读取一个无符号整数,确保该值在 [00000, 100000) 范围内并提取数字(模 10 并除以 10)。对于前导零,您必须读取一个由五个字符组成的字符串并通过 istingstream 进行转换。
  • 替代方案:逐个字符读取并转换每个字符(可能会更好)

标签: c++ string int assign


【解决方案1】:

就这么简单:

std::string num = "94715";
size_t i = 0;
assert( num.length() > 4 );
int a = num[i++] - '0';
int b = num[i++] - '0';
int c = num[i++] - '0';
int d = num[i++] - '0';
int e = num[i++] - '0';

注意:这在不使用 ACII 编码的系统上可能无法正常工作,但您不太可能遇到此类问题。

【讨论】:

  • 简单、容易、快速。非常感谢!! :D
【解决方案2】:
int number = 9544; 
int vector[10]; // you can make it as big as you want or simply use std::vector
int position = 0;
while (number != 0)
{
    vector[position++] = number % 10; // this assigns the last digit
    number = number / 10; // remove the last digit
}
for(int i=0; i<position; i++)
    std::cout << vector[i]; // this will print 4459

现在你的号码的位数在一个 int 向量中。

【讨论】:

    【解决方案3】:

    此示例使用字符,因为字符串仍然是字符数组。 如果您在 Windows 上,这是适用的。只需输入并按enter 键。 就像 Dieter Lücking 建议的那样,它是逐字逐句的。

    它使用conio.h 中的kbhit()getch() 来处理单个字符。 然后它将字符与适当的位置相乘以获得完整的整数。 然后将它们存储在数组digitArray[ ] 中,然后将它们分配给a,b,c,de。现在你可以用a,b,c,de做任何事情。

    这里有一些代码来演示。

       // Re: Now it is just clunky 
       //         one                ten              hundred              thousand
       //          1                  2                  3                    4
       //digitn=digitArray[3]*1 + digitArray[2]*10 +digitArray[1]*100 +digitArray[0]*1000
    
    #include <iostream>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    using namespace std;
    
    int digit=0,digitInput=0;
    int digitArray[10]={0},digitn;
    int numberOfInputDigits=7;
    void SplitIntoDigits(void);
    int a=0,b=0,c=0,d=0,e=0,f=0;
    
    
    int main(){
    
        system("color 1F");     //Blue background    
        while(1){
    
           cout<<"\nPlease enter number. Max Input is  "<<numberOfInputDigits<<" individual digits \n";
           cout<<"or press enter when done  \n>" ;       
    
           memset(digitArray,0,sizeof(digitArray));
           a=0;b=0;c=0;d=0;e=0;f=0;
    
           SplitIntoDigits();
    
           //cout<<"\n"<<digitArray[7]="<<digitArray[7];
           cout<<"\n\n";
    
           a = digitArray[0];
           b = digitArray[1];
           c = digitArray[2];
           d = digitArray[3];
           e = digitArray[4];
           f = digitArray[5];
    
           cout<<"a = "<< a <<"\n";
           cout<<"b = "<< b <<"\n";
           cout<<"c = "<< c <<"\n";
           cout<<"d = "<< d <<"\n";
           cout<<"e = "<< e <<"\n";
           cout<<"f = "<< f <<"\n";
    
    
           cout<<"\n\n The whole combined int number is "<<digitn<<"\n\n";
    
        }
    
    
        return 0;
    }
    
    
    /*********************************
     *                               *
     ********************************/
    
    void SplitIntoDigits(void){
       digitArray[0]=0;
       digitArray[1]=0;
       digit=0;
       digitInput=0;
    
       while((digit<numberOfInputDigits)){
           if (kbhit()){
    
               digitInput=getch();
               if (digitInput==27) exit(0);
    
               if ((digitInput>47) && (digitInput<59)) {
                 digitArray[digit]=(unsigned char)digitInput-48;
                 digit++;
    
                 cout<<digitInput-48;
    
               }
               if (digitInput==13)  { digitn=digitArray[0]; break; }
           }
       }
    
       switch(digit) {
           case 0:
           case 1:
                digitn=digitArray[0]*1 ;
           break;
    
           case 2:
                digitn= digitArray[1]*1  +digitArray[0]*10  ;
           break;
    
           case 3:
                digitn=  digitArray[2]*1+digitArray[1]*10 +digitArray[0]*100  ;
           break;
    
           case 4:
                 digitn=digitArray[3]*1+digitArray[2]*10+digitArray[1]*100+digitArray[0]*1000 ;
           break;
    
           case 5:
                 digitn=digitArray[4]*1+digitArray[3]*10+digitArray[2]*100+digitArray[1]*1000+digitArray[0]*10000 ;
           break;
    
           case 6:
                 digitn=digitArray[5]*1+digitArray[4]*10+digitArray[3]*100+digitArray[2]*1000+digitArray[1]*10000 
                       +digitArray[0]*100000;
           break;
    
    
           case 7:
                 digitn=digitArray[6]*1+digitArray[5]*10+digitArray[4]*100+digitArray[3]*1000+digitArray[2]*10000 
                       +digitArray[1]*100000 +digitArray[0]*1000000;
           break;
    
    
           case 8:
                 digitn=digitArray[7]*1+digitArray[6]*10+digitArray[5]*100+digitArray[4]*1000+digitArray[3]*10000 
                       +digitArray[2]*100000 +digitArray[1]*1000000+digitArray[0]*10000000;
           break;
    
           case 9:
                 digitn=digitArray[8]*1+digitArray[7]*10+digitArray[6]*100+digitArray[5]*1000+digitArray[4]*10000 
                       +digitArray[3]*100000 +digitArray[2]*1000000+digitArray[1]*10000000 +digitArray[0]*100000000;
           break;
    
    
       }
    
    
      // if (digitInput!=13)  digitn=digitArray[3]*1+digitArray[2]*10+digitArray[1]*100+digitArray[0]*1000 ;
       //cout<<("\n%i\n\n",digitn);
    }
    
    /*********************************
     *                               *
     ********************************/
    

    【讨论】:

    • 不可能:using namespace std; 并使用 global variables。这是一个糟糕的答案。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2017-09-30
    相关资源
    最近更新 更多