【问题标题】:function convert string to int - C函数将字符串转换为 int - C
【发布时间】:2015-08-28 13:33:59
【问题描述】:

我想扫描一个至少包含 200 个字符的字符串,然后我想将该字符串 convert 转换为 int,以便我可以使用例如打印它printf("%d", digit).

我怎样才能写出像我在这里写的这样的函数 (这个不行!):

int main()
{

  char car[200];
  int number;
  int i,x;
  int sum = 0;

  printf("Write in number: \n");
  scanf("%c", &car);

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

    if (car[i] != '\0') {
      x = car[i]-'0';
      sum = sum + x;

      if (i != 0) {
        sum = sum*10;
      }
    }
  }

  return 0;
}

【问题讨论】:

  • 问自己这个问题:int 可以包含的最大值是多少?然后想想你问题的“至少 200 个字符部分”。
  • scanf("%c", &amp;car); 应该是 scanf("%s", car); 在 int(或 long)中可以放置的最大数字是 2^32 (2^64)。可能会超过 200 位数。
  • @PaulOgilvie:错了。 int 的范围是_实现定义的。有最低要求 (+/-32767),但没有最高要求。限制。 INT_MININT_MAX 为实现提供了这个范围 (limits.h)..
  • @asimes: 错了,看我上面的评论。
  • @asimes:请指出C 标准 声明的地方! (而且我不需要计算器)

标签: c string char int


【解决方案1】:

第一:

scanf("%c", &car);

来自man scanf

c
匹配长度由最大字段宽度指定的字符序列(默认为 1);下一个指针 必须是指向char的指针,并且必须有足够的 所有字符的空间(不添加终止空字节)。前导空白的通常跳过被抑制。至 首先跳过空格,使用显式空格 格式。

所以你读的是一个字符,而不是整个字符串。

然后,您需要添加一个终止的空字节,这并没有发生。请改用%199s,为终止的空字节留出足够的空间。

那么,考虑到这个世界上没有int 应该有足够的空间容纳 199 位十进制数字,你应该考虑一下你的 200 字符缓冲区。

【讨论】:

    【解决方案2】:

    如果你的目标不是为了教育目的而编写这样一个函数,而是因为你需要一个:

    int number;
    scanf("%d", &number); 
    

    正是这样做的:从输入中读取一个数字,并将其放入number

    【讨论】:

      【解决方案3】:
      scanf("%s", car);
      

      您需要读取字符串 %s 而不是单个字符 %c。当作为参数传递时,char 数组也会衰减为指针,所以你不应该使用 &char。

      【讨论】:

        【解决方案4】:

        这是解决方案,从字符串的末尾开始,因为单位位置是从右到左,然后将单位位置递增到十位,然后是 100,依此类推。

        #include<stdio.h>
        #include<string.h>
        
        int main()
        {
            char input[9];
            int digit,number=0,i=1;
        
            printf("Enter Number:\n");
            scanf("%s",input);
            digit=strlen(input)-1;
            while(digit>=0)
            {
        
                    number=number + i*(input[digit]-'0');
                    digit=digit-1;
                    i=i*10;
        
            }
            printf("%d",number);
        
            return 0;
        }
        

        【讨论】:

          【解决方案5】:

          关闭。建议更改如下。

          使用 char car[200+1] 来“至少占用 200 个字符”。

          使用"%200s" 而不是"%c" 来读取字符串而不是char 并限制其输入。

          //int main()
          int main(void) {
            // char car[200];
            char car[200+1];
            int number;
            int i,x;
            int sum = 0;
          
            printf("Write in number: \n");
            // scanf("%c", &car);
            scanf("%200s", car);
          
            // for (i=0; i<200; i++) {
            for (i=0; car[i]; i++) {
              // if (car[i] != '\0'){
              x = car[i]-'0';
              // sum = sum + x;
              sum = 10*sum + x;
              // if (i != 0) { sum = sum*10; }
            }
            printf("%d\n", sum)
            return 0;
          }
          

          除非输入像“000000000000000000000000000123”,否则200位肯定会溢出sum

          检测

              x = car[i]-'0';
              if (sum >= INT_MAX/10 && (sum > INT_MAX/10 || x > INT_MAX%10)) {
                x = INT_MAX;
                // maybe set an error flag
                break; 
              }
              sum = 10*sum + x;
          

          int 的最大值为 INT_MAX,来自 #include &lt; limits.h&gt;至少 32767。某些平台使用 16 位、32 位或 64 位 int 其他范围是可能的。让我们假设最坏的情况是 128 位。那将需要大约 39 个十进制数字。为符号留出空间并终止空字符,建议

          char car[39+1+1];
          

          【讨论】:

          • 你忘记了终止条件! ——哎呀……是的,你有。我很抱歉。
          • 你不应该使用 200,而应该使用 199。终止字节必须仍然合适!
          • @Marcus Müller OP 希望“占用至少 200 个字符”,因此缓冲区的大小应至少为 201。"%200s" 是正确的格式。
          • 啊,是的,你是对的,如果我们包含你的编辑,将+1 添加到char[200]。尽管如此,一个 200 位的数字还是不适合 int。
          • @Marcus Müller 请参阅有关许多数字输入的编辑。 “你不应该使用 200,而是 199”的评论是不正确的,因为答案的缓冲区大小是 201。
          猜你喜欢
          • 2021-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-07
          • 1970-01-01
          相关资源
          最近更新 更多