【发布时间】:2020-09-27 01:58:10
【问题描述】:
在下面的程序中,我尝试使用strcmp 比较字符串中第 i 位的字符串。我使用的测试用例是1+2+2+1+3。但是,除了循环的第一次迭代之外,strcmp 即使在字符串匹配时也显示非零输出。为什么会这样?
#include <stdio.h>
#include <string.h>
int main() {
char num[101];
int n1 = 0, n2 = 0, n3 = 0;
scanf(" %s", num);
int len = strlen(num);
for (int i = 0; i < len; i = i + 2) {
char dig = num[i];
printf("\ndig: %c", dig);
int c1 = strcmp(&dig, "1");
printf("\nc1: %d", c1);
if (c1 == 0) {
n1++;
continue;
}
int c2 = strcmp(&dig, "2");
printf("\nc2: %d", c2);
if (c2 == 0) {
n2++;
continue;
}
int c3 = strcmp(&dig, "3");
printf("\nc3: %d\n\n", c3);
if (c3 == 0) {
n3++;
continue;
}
}
printf("\nn1: %d n2: %d n3: %d", n1, n2, n3);
for (int j = 0; j < len; j = j + 2) {
if (n1 > 0) {
num[j] = '1';
n1--;
continue;
}
if (n2 > 0) {
num[j] = '2';
n2--;
continue;
}
if (n3 > 0) {
num[j] = '3';
n3--;
continue;
}
}
printf("\n%s", num);
return 0;
}
【问题讨论】:
-
&dig指向单个字符而不是字符串。strcmp需要一个字符串。 C 中的字符串是 NUL 终止 字符序列。使用非字符串调用strcmp是未定义行为。 -
在不相关的注释中,
scanf的%s格式将自动跳过前导空格,不需要您在格式" %s"中的前导空格。