liaojuelong 发表于 2022-6-16 19:02:13

C语言第十三课习题相关问题

2. C 语言中有个 atoi 函数(定义于 <stdlib.h> 头文件中),用于将字符串中的值解析为对应的整型数字。现在要求我们自己写一个程序,实现类似的功能。
基本要求:Powered by bbs.fishc.com
    A. 将用户输入的字符串中代表数字的字符转换为整型数值4O]0QM
    B. 打印转换结果来自:bbs.fishc.com
    C. 只打印第一组数字来自:bbs.fishc.com
提示:你可以使用 break 语句在适当的时候跳出循环。
我的写法是:

#include<stdio.h>
#include<stdlib.h>
int main()
{
char a;
int i,b;
printf("请输入一行英文字母:");
scanf("%s",a);
for(i=0;i<100;i++)
   {
          if(!(a>='0'&&a<='9')&&(a!=' '))
                a=' ';//将不是数字或者空格的字符换成空格。
                else
                  break; //第一次遇见数字或空格时跳出循环,计算整型数。
   }
b=atoi(a);
printf("整数是%di=%d",b,i);//putchar(b);这样不行,
return 0;
}
//问题,输入【   123.45时,结果为0?
为什么输入【   123时候结果为零呢?

人造人 发表于 2022-6-16 19:11:10

把代码写好

#include <stdio.h>
#include <stdlib.h>

int main() {
    char a;
    int i, b;
    printf("请输入一行英文字母:");
    //scanf("%s", a);
    fgets(a, 100, stdin);
    for(i = 0; i < 100; i++) {
      if(!(a >= '0' && a <= '9') && (a != ' '))
            a = ' '; //将不是数字或者空格的字符换成空格。
      else
            break; //第一次遇见数字或空格时跳出循环,计算整型数。
    }
    b = atoi(a);
    printf("整数是%di=%d\n", b, i); // putchar(b);这样不行,
    return 0;
}

liaojuelong 发表于 2022-6-16 19:16:52

人造人 发表于 2022-6-16 19:11
把代码写好

{:10_254:}正在学习中

liaojuelong 发表于 2022-6-16 20:44:29

人造人 发表于 2022-6-16 19:11
把代码写好

还是不行,是不是我的逻辑判断有误呢?{:10_266:}

人造人 发表于 2022-6-16 20:50:16

liaojuelong 发表于 2022-6-16 20:44
还是不行,是不是我的逻辑判断有误呢?

?

liaojuelong 发表于 2022-6-16 20:57:01

{:10_266:}刚刚看了小甲鱼的标准答案,太难想到了{:10_266:},我能想到的就是把数字开头的字母都替换成空格,,,然后再调用atoi

liaojuelong 发表于 2022-6-17 01:35:54

{:10_266:}想了一晚上,可能是,scanf("%s",a),输入不接受空格,会把空格后面的内容忽略,改为scanf("%[^\n]",a),又正常一点,但是还不是很正常。

liaojuelong 发表于 2022-6-17 01:53:26

可能是,判断条件还是不够严谨。。。。。
因为输入    ahss       hsjshsj       jdkj,.;'[]    sdjhgj      2456354      的话,只有第一串ahss被替换,因为elsebreak;(第一次遇见空格就跳出循环)了,就没有对后面进行替换。
正确应该是第一次遇见数字就跳出循环,这样才对{:10_250:}折腾一个晚上,现在慢慢明白了{:10_266:}

人造人 发表于 2022-6-17 02:18:52

liaojuelong 发表于 2022-6-17 01:53
可能是,判断条件还是不够严谨。。。。。
因为输入    ahss       hsjshsj       jdkj,.;'[]    sdjhgj    ...

#include <stdio.h>
#include <stdlib.h>

int main() {
    char a;
    int i, b;
    printf("请输入一行英文字母:");
    //scanf("%s", a);
    fgets(a, 100, stdin);
    for(i = 0; i < 100; i++) {
      //if(!(a >= '0' && a <= '9') && (a != ' '))
      if(!(a >= '0' && a <= '9'))
            a = ' '; //将不是数字或者空格的字符换成空格。
      else
            break; //第一次遇见数字或空格时跳出循环,计算整型数。
    }
    b = atoi(a);
    printf("整数是%di=%d\n", b, i); // putchar(b);这样不行,
    return 0;
}

傻眼貓咪 发表于 2022-6-17 13:15:54

#include <stdio.h>

int atoi(char* str) {
        int res;
        for (int i = 0; str != '\0'; ++i)
        res = res * 10 + str - '0';
        return res;
}

int main(void) {
        char *str = "123456789";
        printf("%d", atoi(str));
}

人造人 发表于 2022-6-17 13:44:49

傻眼貓咪 发表于 2022-6-17 13:15


$ cat main.c
#include <stdio.h>

int atoi(char* str) {
      int res;
      for (int i = 0; str != '\0'; ++i)
      res = res * 10 + str - '0';
      return res;
}

int main(void) {
      char *str = "123456789";
      //printf("%d", atoi(str));
      printf("%d\n", atoi(str));
}
$ gcc-debug -o main main.c
$ ./main
main.c:6:19: runtime error: signed integer overflow: -338770695 * 10 cannot be represented in type 'int'
261244693
$ ./main
main.c:6:19: runtime error: signed integer overflow: -1395735303 * 10 cannot be represented in type 'int'
261244693
$ ./main
main.c:6:19: runtime error: signed integer overflow: 1219413241 * 10 cannot be represented in type 'int'
-812497131
$ ./main
main.c:6:19: runtime error: signed integer overflow: 982435065 * 10 cannot be represented in type 'int'
-1886238955
$ ./main
main.c:6:19: runtime error: signed integer overflow: -628177671 * 10 cannot be represented in type 'int'
-1886238955
$ ./main
main.c:6:19: runtime error: signed integer overflow: 621724921 * 10 cannot be represented in type 'int'
-1886238955
$ ./main
main.c:6:19: runtime error: signed integer overflow: 344900857 * 10 cannot be represented in type 'int'
-1886238955
$ ./main
main.c:6:19: runtime error: signed integer overflow: 604947705 * 10 cannot be represented in type 'int'
-1886238955
$ ./main
main.c:6:19: runtime error: signed integer overflow: 602850553 * 10 cannot be represented in type 'int'
1334986517
$ ./main
main.c:6:19: runtime error: signed integer overflow: 1076806905 * 10 cannot be represented in type 'int'
-812497131
$ ./main
main.c:6:19: runtime error: signed integer overflow: 1831781625 * 10 cannot be represented in type 'int'
-812497131
$ ./main
main.c:6:19: runtime error: signed integer overflow: 997115129 * 10 cannot be represented in type 'int'
1334986517
$ vim main.c
$ cat main.c
#include <stdio.h>

int atoi(char* str) {
      //int res;
      int res = 0;
      for (int i = 0; str != '\0'; ++i)
      res = res * 10 + str - '0';
      return res;
}

int main(void) {
      char *str = "123456789";
      //printf("%d", atoi(str));
      printf("%d\n", atoi(str));
}
$ gcc-debug -o main main.c
$ ./main
123456789
$ ./main
123456789
$ ./main
123456789
$ ./main
123456789
$

傻眼貓咪 发表于 2022-6-17 13:50:57

人造人 发表于 2022-6-17 13:44


哈哈,还是大佬厉害。我用手机写,没有注意,粗心了#include <stdio.h>

int atoi(char* str) {
        int res = 0; // <--------------- 我太粗心了
        for (int i = 0; str != '\0'; ++i)
        res = res * 10 + str - '0';
        return res;
}

int main(void) {
        char *str = "123456789";
        printf("%d", atoi(str));
}

liaojuelong 发表于 2022-6-17 17:19:47

傻眼貓咪 发表于 2022-6-17 13:50
哈哈,还是大佬厉害。我用手机写,没有注意,粗心了

{:10_282:}向大咖们学习

liaojuelong 发表于 2022-6-17 17:21:15

人造人 发表于 2022-6-17 02:18


{:10_266:}就是这样,感谢{:10_254:}
页: [1]
查看完整版本: C语言第十三课习题相关问题