【问题标题】:C strcpy and strcatC strcpy 和 strcat
【发布时间】:2016-01-21 19:12:36
【问题描述】:

我有一个关于 strcpy 和 strcat 的问题。

在我尝试制作的程序中,我需要从财务代码中获取某人出生的年份。财政代码作为来自串行端口的字符给出,

strcpy(temp, code[6]);
strcat(temp, code[7]);
yyyy = 1900 + (atoi(temp));

这就是我想出的:基本上,年份的最后两位数字将被添加到 1900 年(我知道这对 2000 年出生的人不太适用)。 使用strcpy将第一个数字从完整代码复制到临时变量,然后我想添加第二个数字然后使用atoi并将eveything转换为整数;为此,我以从未见过的方式使用 strcat。我做对了吗?

【问题讨论】:

  • code 是如何声明的?
  • 什么是codetemp 是什么?这不是小事,这就是“工作正常”和“未定义行为”之间的区别。
  • 您需要展示更多的代码才能获得与某些测试结果相关的帮助。
  • 万一code是一个C字符串(char[]),注意strcpystrcat都需要char *操作数,而你传递char.. . 即未定义的行为。

标签: c strcpy strcat atoi


【解决方案1】:

不需要strcpy/strcat(无论如何它们都不适合这种情况)。也不需要临时字符串。你可以这样做:

yyyy = 1900 + (code[6] - '0') * 10 + (code[7] - '0');

这只是提取两个数字字符,将每个字符转换为 0..9 范围内的整数,然后根据这两个值计算年份。

【讨论】:

  • ^^ 哈哈。无论如何,实际上不允许编写代码 - 这太复杂了。您只能使用库函数来处理 C 中的字符串 :)
  • @Rhymoid:在 C 和 C++ 中,相关标准都要求 0 到 9 的字符是连续且有序的,因此该技术适用于 ASCII 和 EBCDIC 以及其他任何相关的内容。跨度>
  • @Rhymoid:实际上标准(C 和 C++)确实保证连续数字。 (对于 C,它是第 5.2.1 节第 3 段,“上述十进制数字列表中 0 之后的每个字符的值应比前一个字符的值大一个。”这是 字母不一定是连续的。但我承认,每当我看到这样的“字符算术”时,我也会畏缩,而且我不能 100% 确定如果源字符集 != 执行字符集在交叉编译的情况下会发生什么。;-)
  • @DevSolar 感谢您引用该条款!
  • @MartinJames 这很糟糕,我应该标记为“低质量幽默”;)
猜你喜欢
  • 2016-12-03
  • 1970-01-01
  • 2017-03-15
  • 2016-03-14
  • 2014-08-06
  • 2018-06-21
  • 1970-01-01
  • 2013-08-23
  • 2015-08-16
相关资源
最近更新 更多