提问人:bar toplian 提问时间:3/23/2023 最后编辑:Some programmer dudebar toplian 更新时间:3/24/2023 访问量:83
通过 scanf 的 EOF,返回值 -65 [已关闭]
EOF via scanf, returned value -65 [closed]
问:
我需要在我的“系统编程实验室”中将我的“strcmp”实现写成作业,这只是 C 课程的一个花哨名称。 当我测试代码与标准版本时,它在任何情况下都可以工作,除了 EOF,它在标准版本中自动返回 -1,而在我的版本中,它将开始比较并相应地返回 0,1,-1。 我想写一个宏来处理这种情况。
我正在使用:VMware Workstation 17 Player 运行 Ubuntu 16.04(这些是uni的要求)。
我试过:
#define EOF_CHECK(s1, s2) if ((s1)[0] == EOF || (s2)[0] == EOF ) return -1;
和
#define EOF_CHECK(s1, s2) if ((s1)[0] == '\0' || (s2)[0] == '\0' ) return -1;
和
#define EOF_CHECK(s1, s2) if ((s1) == NULL || (s2) == NULL ) return -1;
他们都没有奏效。 我在 scanf 收到 EOF 后打印了值,结果是 (-65) 十进制。 此宏确实有效:
#define EOF_CHECK(s1, s2) if ((s1)[0] == -65 || (s2)[0] == -65 ) return -1;
但我想避免使用神奇的数字。
答:
我需要将我的实现写成作业
strcmp
和 之间没有联系。 不是字符值,则不应将其存储到字符串中。如果在读取 中的字符串时返回,则目标数组中不会存储任何内容,该数组可能仍处于未初始化状态。在使用字符串之前,必须测试此条件。因此,在处理字符串内容时不需要进行特定测试。strcmp
EOF
EOF
scanf
EOF
stdin
EOF
strcmp
将字符串中的字符作为值进行比较,直到并包括 null 终止符。如果两个字符串对所有字符的比较相等并且长度相同,则返回,否则,如果两个字符串中不相等的第一个字符的值小于第二个字符串的值,则返回负值(或任何其他负值)(对值执行比较)。否则,它将返回一个正值(或其他值)。经典实现返回字符值的差异,例如,如果比较 和 ,则可能是 。unsigned char
0
-1
unsigned char
1
-65
""
"A"
scanf
是一个完全独立的功能,重新实现要困难得多。
我建议您不要在赋值中使用宏,尤其是扩展为语句的宏,因为它们隐藏了流控制构造,因此非常容易出错。
下面是 :strcmp
// Assuming UCHAR_MAX <= INT_MAX
int strcmp(const char *s1, const char *s2) {
/* use unsigned char for comparisons */
const unsigned char *p1 = (const unsigned char *)s1;
const unsigned char *p2 = (const unsigned char *)s2;
for (; *p1 == *p2; p1++, p2++) {
if (*p1 == '\0')
return 0;
}
return *p1 - *p2;
}
评论
char
char
unsigned char
26
Ctrl-Z
memcmp
、strcmp 和 strncmp
返回的非零值的符号由在被比较的对象
中不同的第一对字符(均解释为无符号字符
)的值之间的差值的符号确定。可以解释为与哪个没有区别,因为负零转换为 时转换为 。(unsigned char)*s1 == (unsigned char)*s2
*s1 == *s2
0
(unsigned char)
评论
scanf
scanf
scanf
s1
s2
scanf
scanf