2 fanage fanage 于 2016.02.01 11:49 提问

数字为什么没有读进去?C++
c++

读入一个字符串 如果字符串是数字开头的 为什么就读不进去了?
代码如下 为什么结果是这样的?为什么明明输入的是“75BCD15”而读入的确是”BCD15“?怎么能让数字也读进去呢?尝试了scanf和gets两种方法 都不对。。

#include <iostream>
#include <stdlib.h>
#include<cstring>
#include <stdio.h>
using namespace std;

long long int val(char * hex)
{
    long long int n = 0;
    while (*hex != '\0')
    {
        n *= 16;
        if (*hex >= 'A' && *hex <= 'F')
        {
            n += *hex - 'A' + 10; 
        }
        if (*hex >= 'a' && *hex <= 'f')
        {
            n += *hex - 'a' + 10; 
        }
        if (*hex >= '0' && *hex <= '9')
        {
            n += *hex - '0'; 
        }
        hex++;
    }
    return n;
}

int main()
{
    int n,i;
    cin>>n;
    string a[n];
    char input[1000] ;
    gets(input);
   // scanf("%s",&input);
    printf("%s\n",input);
    long long int v = val(input);
    printf("%lld",v);
//  cout<<v<<endl;
    return 0;
}  


6个回答

jymfist
jymfist   2016.02.01 12:03
已采纳

你的cin>>n;是干嘛用的呢?
直接干掉不就好了? 看下下面的运行过程,你的75被cin>>n吃掉了

(gdb) n
33 cin>>n;
(gdb)
75BCD15
34 string a[n];
(gdb) p n
$1 = 75
(gdb) n
36 gets(input);
(gdb) n
38 printf("%s\n",input);
(gdb) n
BCD15
39 long long int v = val(input);
(gdb) p input
$2 = "BCD15\000\000\000@\336\377\377\377\177\000\000\320\224\377\367\377\177\000\000#E\336\367\377\177\000\000\000\000\000\000\000\000\000\000\020.\376\367\377\177\000\000\001", '\000' , "\001\000\000\000\377\177\000\000t:\336\367\377\177\000\000\006\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\006\000\000\000\000\000\000\000\230*\376\367\377\177\000\000\332\026\207\060\000\000\000\000\236B\336\367\377\177\000\000\006\000\000\000\000\000\000\000\032\000\000\000\377\177\000\000\020\337\377\377\377\177\000\000\377\377\377\377\000\000\000\000\300\346\255\367\377\177\000\000\250\372\255\367\377\177\000\000\340\336\377\377\377\177\000\000\377\377\377\377\000\000\000\000\260\342\256\367\377\177\000\000t:\336\367\377\177\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\006\000\000\000\000\000\000\000\230*\376\367\377\177\000\000\355\351C+\000\000\000\000\236B\336\367\377\177\000\000\000\000\000\000\001\000\000\000-\000\000\000\001\000\000\000\220\337\377\377\377\177\000\000\377\377\377\377\000\000\000\000\340\206P\367"...

ayangmax
ayangmax   2016.02.01 11:59

数组怎么能用变量呢?

91program
91program   Ds   Rxr 2016.02.01 12:28

数组只能是常量下标:

 int n,i;
    cin>>n;
    string a[n];    //编译应该无法通过吧?
fanage
fanage 回复91program: 谢谢!粘贴了以后忘记删了
接近 2 年之前 回复
jymfist
jymfist 回复91program: 可以通过编译的,试试便知,不能被书本害了
接近 2 年之前 回复
91program
91program 即然输入n 没有用,就把这部分代码注释掉试试吧
接近 2 年之前 回复
wyj21js
wyj21js   2016.02.01 15:42

gets 方法,现在不推荐使用了。

DO NOT USE THIS FUNCTION!! There is no limit on how much it will read.

最好用getchar方法,例如:

int i(0);

const int MAX_LENGTH = 1000;

char input[MAX_LENGTH];
//从控制台流中读取字符,直到按回车键结束
while ((input[i] = getchar()) != '\n') {

    if (i > MAX_LENGTH - 1) {
        break;
    }
    ++i;
};

input[i] = 0;

// scanf("%s",&input);
printf("The input string is:%s\n", input);
long long int v = val(input);
printf("%lld", v);
//  cout<<v<<endl;
return 0;

wyj21js
wyj21js   2016.02.01 15:47

刚才input 数组下标有越界的问题

int i(0);

const int MAX_LENGTH = 1000;

char input[MAX_LENGTH];

while ((input[i] = getchar()) != '\n') {
    ++i;
    if (i >= MAX_LENGTH - 1) {
        break;
    }
};
input[i] = 0;
//从控制台流中读取字符,直到按回车键结束

// scanf("%s",&input);
printf("The input string is:%s\n", input);
long long int v = val(input);
printf("%lld", v);
//  cout<<v<<endl;
return 0;

qq_27183003
qq_27183003   Ds   Rxr 2016.02.01 16:59

1、c、c++语言规定数组长度必须是常量,不能是变量。但是有的编译器是允许是变量。
2、cin读入一个整数后,把回车留在了缓冲区,gets就会读入一个空字符串。
解决方法1:在cin后用fflush清空缓冲区。
推荐方法2:不动态申请数组,直接定义一个大数组,如:string a[100];

    cin>>n;
    fflush(stdin);//增加
    string a[n];
    char input[1000] ;
    gets(input);

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!