在C

时间:2016-01-13 13:00:30

标签: c

我必须编写一个程序,将用户输入(字符串)转换为Integer。如果用户输入确实是一个数字,它应该同时检查。 还有一种方法。

并允许没有图书馆功能。

我无法想出怎么做。我在开始时得到的只是这种可悲的结构

#include <stdio.h>

void main()
{
  char input[100];
  int i;
  int sum = 0;
  printf("Type a String which will be converted to an Integer: ");
  scanf("%c, &input");

  for (i = 0; i < 100; i++)
   {

   }
}

我感谢任何帮助,谢谢

7 个答案:

答案 0 :(得分:3)

转换很容易......

但是如果你不能使用库函数,

  • 只有一种接受字符串的方式,即argv;
  • 只有一种方法可以提供整数,这就是程序的退出代码。

所以,没有太多的麻烦:

int main( int argc, char * argv[] )
{
    int rc = 0;
    if ( argc == 2 ) // one, and only one parameter given
    {
        unsigned i = 0;
        // C guarantees that '0'-'9' have consecutive values
        while ( argv[1][i] >= '0' && argv[1][i] <= '9' )
        {
            rc *= 10;
            rc += argv[1][i] - '0';
            ++i;
        }
    }
    return rc;
}

我没有实现'+''-'的检查,也没有找到一种方法来表示“输入不是数字”。我也只是停止解析第一个非数字。所有这一切都可以改进,但这应该让你知道如何解决“无库函数”限制。

(因为这听起来像是一个家庭作业,你应该必须写一些你自己的代码。我已经给了你三个勺子帮助{{1} },argv和转化本身。)

请致电:

'0'-'9'

(例如<program name> <value>

检查返回代码(对于Linux shell):

./myprogram 28

在Windows上,这是关于echo $? 或某些事情......或许有用的Windows用户会对此发表评论。

echo %ERRORLEVEL%连续”声明的来源:ISO / IEC 9899:1999 5.2.1字符集,第3段:

  

在源基本字符集和执行基本字符集中,上述小数位数列表中'0'-'9'之后的每个字符的值应大于前一个值的值。

我确信这是在C11中保留的,但我只提供较旧的C99纸张。

答案 1 :(得分:2)

取高位数并将其添加到数字,将数字乘以10并添加下一个数字。等等:

#include <stdio.h> // scanf, printf

void main()
{
    char input[100];
    printf("Type a String which will be converted to an Integer: ");
    scanf("%s", input);

    int number = 0;
    int neg = input[0] == '-';
    int i = neg ? 1 : 0;
    while ( input[i] >= '0' && input[i] <= '9' )
    {
      number *= 10;             // multiply number by 10
      number += input[i] - '0'; // convet ASCII '0'..'9' to digit 0..9 and add it to number           
      i ++;                     // step one digit forward
    }
    if ( neg )
       number *= -1;

    printf( "string %s -> number %d", input, number );
}

input[i] - '0'有效,因为ASCII字符&#39; 0&#39; ...&#39; 9&#39;具有从48到57的升序ASCII码。

答案 2 :(得分:0)

很多错过的东西。首先接受一个字符串是由scanf("%s",input);完成的。通过接收它的方式,它只存储一个字符,然后运行循环直到收到字符串的长度。检查以下代码。

#include <stdio.h>
#include<string.h>

void main()
{
    char input[100];
    int i;
    int sum = 0;
    printf("Type a String which will be converted to an Integer: ");
    scanf("%s", input);

    for (i = 0; i < strlen(input); i++)
    {
        if(input[i]>=48 && input[i]<=57)
        {
             //do something, it is a digit
             printf("%d",input[i]-48);
             //48 is ascii value of 0
    }
}  

答案 3 :(得分:0)

所以基本上你想知道标准库atoi之类的东西是如何工作的。为此,您需要考虑字符串如何表示数字。

基本上,字符串(表示数字)是从0到9的数字列表。字符串abcd(其中a,b,c,d是任何数字的占位符)表示数字a * 10 ^ 3 + b * 10 ^ 2 + c * 10 + d(此处考虑基数10,类似于其他碱基)。所以基本上你需要如上所示分解字符串并执行所需的arhitmetic操作:

// s - the string to convert
int result = 0;
for (int index = 0; index < strlen(s); index++) {
    result = result * 10 + s[index] - '0';
}

操作s[index] - '0'将表示数字的字符转换为其值。

答案 4 :(得分:0)

//  the function returns true for success , and false for failure
// the result is stored in result parameter
// nb: overflow not handled

int charToInt(char *buff,int *result){
    *result=0;
    char c;
    while(c=*buff++){
        if((c < '0') || (c >'9')) // accept only digits;
            return 0;
        *result *= 10;
        *result += c-'0';
    }
    return 1;
}

答案 5 :(得分:-1)

试一试:

$("#slider-customer-type").on("change", function() {
    if($("#slider-customer-type").val()==0) {
        $("#partial-customertype-business").removeClass("show");
        $("#partial-customertype-business").addClass("hide");
        $("#partial-customertype-personal").addClass("show");
    } else {
        $("#partial-customertype-personal").removeClass("show");
        $("#partial-customertype-personal").addClass("hide");
        $("#partial-customertype-business").addClass("show");
    }
    $("#myform :input").prop("value", '');
});

答案 6 :(得分:-1)

如果您希望您的代码可以移植到不使用ASCII的系统,那么您必须循环遍历char数组,并将源中的每个字符与每个可能的数字进行比较性格,如:

int digit;
switch(arr[i]) {
    case '0':
        digit=0; break;
    case '1':
        digit=1; break;
    // etc
    default:
        // error handling
}

然后,将数字添加到结果变量中(在将其乘以10之后)。

如果您可以采用ASCII,则可以用以下方法替换整个switch语句:

if(isdigit(arr[i])) {
    digit=arr[i] - '0';
} else {
    // error handling
}

这是有效的,因为在ASCII表中,所有数字都在一个范围内,按升序排列。通过减去零字符的序数值,可以得到该数字的值。通过添加isdigit()宏,您还可以确保只以这种方式转换数字字符。