鱼C论坛

 找回密码
 立即注册
查看: 1554|回复: 13

[已解决]C语言第十三课习题相关问题

[复制链接]
发表于 2022-6-16 19:02:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2. C 语言中有个&#160;atoi&#160;函数(定义于 <stdlib.h> 头文件中),用于将字符串中的值解析为对应的整型数字。现在要求我们自己写一个程序,实现类似的功能。
基本要求:Powered by&#160;bbs.fishc.com
    A. 将用户输入的字符串中代表数字的字符转换为整型数值4O]0QM
    B. 打印转换结果来自:bbs.fishc.com
    C. 只打印第一组数字来自:bbs.fishc.com
提示:你可以使用 break 语句在适当的时候跳出循环。
我的写法是:
截图20220616190023.png
#include<stdio.h>
#include<stdlib.h>
int main()
{
char a[100];
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("整数是%d  i=%d",b,i);//putchar(b);这样不行,
return 0;
}
//问题,输入【   123.45时,结果为0?
为什么输入【   123时候结果为零呢?
最佳答案
2022-6-17 13:44:49
  1. $ cat main.c
  2. #include <stdio.h>

  3. int atoi(char* str) {
  4.         int res;
  5.         for (int i = 0; str[i] != '\0'; ++i)
  6.         res = res * 10 + str[i] - '0';
  7.         return res;
  8. }

  9. int main(void) {
  10.         char *str = "123456789";
  11.         //printf("%d", atoi(str));
  12.         printf("%d\n", atoi(str));
  13. }
  14. $ gcc-debug -o main main.c
  15. $ ./main
  16. main.c:6:19: runtime error: signed integer overflow: -338770695 * 10 cannot be represented in type 'int'
  17. 261244693
  18. $ ./main
  19. main.c:6:19: runtime error: signed integer overflow: -1395735303 * 10 cannot be represented in type 'int'
  20. 261244693
  21. $ ./main
  22. main.c:6:19: runtime error: signed integer overflow: 1219413241 * 10 cannot be represented in type 'int'
  23. -812497131
  24. $ ./main
  25. main.c:6:19: runtime error: signed integer overflow: 982435065 * 10 cannot be represented in type 'int'
  26. -1886238955
  27. $ ./main
  28. main.c:6:19: runtime error: signed integer overflow: -628177671 * 10 cannot be represented in type 'int'
  29. -1886238955
  30. $ ./main
  31. main.c:6:19: runtime error: signed integer overflow: 621724921 * 10 cannot be represented in type 'int'
  32. -1886238955
  33. $ ./main
  34. main.c:6:19: runtime error: signed integer overflow: 344900857 * 10 cannot be represented in type 'int'
  35. -1886238955
  36. $ ./main
  37. main.c:6:19: runtime error: signed integer overflow: 604947705 * 10 cannot be represented in type 'int'
  38. -1886238955
  39. $ ./main
  40. main.c:6:19: runtime error: signed integer overflow: 602850553 * 10 cannot be represented in type 'int'
  41. 1334986517
  42. $ ./main
  43. main.c:6:19: runtime error: signed integer overflow: 1076806905 * 10 cannot be represented in type 'int'
  44. -812497131
  45. $ ./main
  46. main.c:6:19: runtime error: signed integer overflow: 1831781625 * 10 cannot be represented in type 'int'
  47. -812497131
  48. $ ./main
  49. main.c:6:19: runtime error: signed integer overflow: 997115129 * 10 cannot be represented in type 'int'
  50. 1334986517
  51. $ vim main.c
  52. $ cat main.c
  53. #include <stdio.h>

  54. int atoi(char* str) {
  55.         //int res;
  56.         int res = 0;
  57.         for (int i = 0; str[i] != '\0'; ++i)
  58.         res = res * 10 + str[i] - '0';
  59.         return res;
  60. }

  61. int main(void) {
  62.         char *str = "123456789";
  63.         //printf("%d", atoi(str));
  64.         printf("%d\n", atoi(str));
  65. }
  66. $ gcc-debug -o main main.c
  67. $ ./main
  68. 123456789
  69. $ ./main
  70. 123456789
  71. $ ./main
  72. 123456789
  73. $ ./main
  74. 123456789
  75. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-16 19:11:10 | 显示全部楼层
把代码写好

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

  3. int main() {
  4.     char a[100];
  5.     int i, b;
  6.     printf("请输入一行英文字母:");
  7.     //scanf("%s", a);
  8.     fgets(a, 100, stdin);
  9.     for(i = 0; i < 100; i++) {
  10.         if(!(a[i] >= '0' && a[i] <= '9') && (a[i] != ' '))
  11.             a[i] = ' '; //将不是数字或者空格的字符换成空格。
  12.         else
  13.             break; //第一次遇见数字或空格时跳出循环,计算整型数。
  14.     }
  15.     b = atoi(a);
  16.     printf("整数是%d  i=%d\n", b, i); // putchar(b);这样不行,
  17.     return 0;
  18. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-16 19:16:52 | 显示全部楼层

正在学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-16 20:44:29 | 显示全部楼层

还是不行,是不是我的逻辑判断有误呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-16 20:50:16 | 显示全部楼层
liaojuelong 发表于 2022-6-16 20:44
还是不行,是不是我的逻辑判断有误呢?

?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-16 20:57:01 | 显示全部楼层
刚刚看了小甲鱼的标准答案,太难想到了,我能想到的就是把数字开头的字母都替换成空格,,,然后再调用atoi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-17 01:35:54 | 显示全部楼层
想了一晚上,可能是,scanf("%s",a),输入不接受空格,会把空格后面的内容忽略,改为scanf("  %[^\n]",a),又正常一点,但是还不是很正常。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-17 01:53:26 | 显示全部楼层
可能是,判断条件还是不够严谨。。。。。
因为输入    ahss       hsjshsj       jdkj,.;'[]    sdjhgj      2456354      的话,只有第一串ahss被替换,因为else  break;(第一次遇见空格就跳出循环)了,就没有对后面进行替换。
正确应该是第一次遇见数字就跳出循环,这样才对折腾一个晚上,现在慢慢明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-17 02:18:52 | 显示全部楼层
liaojuelong 发表于 2022-6-17 01:53
可能是,判断条件还是不够严谨。。。。。
因为输入    ahss       hsjshsj       jdkj,.;'[]    sdjhgj    ...
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main() {
  4.     char a[100];
  5.     int i, b;
  6.     printf("请输入一行英文字母:");
  7.     //scanf("%s", a);
  8.     fgets(a, 100, stdin);
  9.     for(i = 0; i < 100; i++) {
  10.         //if(!(a[i] >= '0' && a[i] <= '9') && (a[i] != ' '))
  11.         if(!(a[i] >= '0' && a[i] <= '9'))
  12.             a[i] = ' '; //将不是数字或者空格的字符换成空格。
  13.         else
  14.             break; //第一次遇见数字或空格时跳出循环,计算整型数。
  15.     }
  16.     b = atoi(a);
  17.     printf("整数是%d  i=%d\n", b, i); // putchar(b);这样不行,
  18.     return 0;
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-6-17 13:15:54 From FishC Mobile | 显示全部楼层
  1. #include <stdio.h>

  2. int atoi(char* str) {
  3.         int res;
  4.         for (int i = 0; str[i] != '\0'; ++i)
  5.         res = res * 10 + str[i] - '0';
  6.         return res;
  7. }

  8. int main(void) {
  9.         char *str = "123456789";
  10.         printf("%d", atoi(str));
  11. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-17 13:44:49 | 显示全部楼层    本楼为最佳答案   
  1. $ cat main.c
  2. #include <stdio.h>

  3. int atoi(char* str) {
  4.         int res;
  5.         for (int i = 0; str[i] != '\0'; ++i)
  6.         res = res * 10 + str[i] - '0';
  7.         return res;
  8. }

  9. int main(void) {
  10.         char *str = "123456789";
  11.         //printf("%d", atoi(str));
  12.         printf("%d\n", atoi(str));
  13. }
  14. $ gcc-debug -o main main.c
  15. $ ./main
  16. main.c:6:19: runtime error: signed integer overflow: -338770695 * 10 cannot be represented in type 'int'
  17. 261244693
  18. $ ./main
  19. main.c:6:19: runtime error: signed integer overflow: -1395735303 * 10 cannot be represented in type 'int'
  20. 261244693
  21. $ ./main
  22. main.c:6:19: runtime error: signed integer overflow: 1219413241 * 10 cannot be represented in type 'int'
  23. -812497131
  24. $ ./main
  25. main.c:6:19: runtime error: signed integer overflow: 982435065 * 10 cannot be represented in type 'int'
  26. -1886238955
  27. $ ./main
  28. main.c:6:19: runtime error: signed integer overflow: -628177671 * 10 cannot be represented in type 'int'
  29. -1886238955
  30. $ ./main
  31. main.c:6:19: runtime error: signed integer overflow: 621724921 * 10 cannot be represented in type 'int'
  32. -1886238955
  33. $ ./main
  34. main.c:6:19: runtime error: signed integer overflow: 344900857 * 10 cannot be represented in type 'int'
  35. -1886238955
  36. $ ./main
  37. main.c:6:19: runtime error: signed integer overflow: 604947705 * 10 cannot be represented in type 'int'
  38. -1886238955
  39. $ ./main
  40. main.c:6:19: runtime error: signed integer overflow: 602850553 * 10 cannot be represented in type 'int'
  41. 1334986517
  42. $ ./main
  43. main.c:6:19: runtime error: signed integer overflow: 1076806905 * 10 cannot be represented in type 'int'
  44. -812497131
  45. $ ./main
  46. main.c:6:19: runtime error: signed integer overflow: 1831781625 * 10 cannot be represented in type 'int'
  47. -812497131
  48. $ ./main
  49. main.c:6:19: runtime error: signed integer overflow: 997115129 * 10 cannot be represented in type 'int'
  50. 1334986517
  51. $ vim main.c
  52. $ cat main.c
  53. #include <stdio.h>

  54. int atoi(char* str) {
  55.         //int res;
  56.         int res = 0;
  57.         for (int i = 0; str[i] != '\0'; ++i)
  58.         res = res * 10 + str[i] - '0';
  59.         return res;
  60. }

  61. int main(void) {
  62.         char *str = "123456789";
  63.         //printf("%d", atoi(str));
  64.         printf("%d\n", atoi(str));
  65. }
  66. $ gcc-debug -o main main.c
  67. $ ./main
  68. 123456789
  69. $ ./main
  70. 123456789
  71. $ ./main
  72. 123456789
  73. $ ./main
  74. 123456789
  75. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-17 13:50:57 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-6-17 13:44

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

  2. int atoi(char* str) {
  3.         int res = 0; // <--------------- 我太粗心了
  4.         for (int i = 0; str[i] != '\0'; ++i)
  5.         res = res * 10 + str[i] - '0';
  6.         return res;
  7. }

  8. int main(void) {
  9.         char *str = "123456789";
  10.         printf("%d", atoi(str));
  11. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-17 17:19:47 | 显示全部楼层
傻眼貓咪 发表于 2022-6-17 13:50
哈哈,还是大佬厉害。我用手机写,没有注意,粗心了

向大咖们学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-17 17:21:15 | 显示全部楼层

就是这样,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表