C中字符串中的字母互换

Switching letters in a string in C

我不确定为什么这段代码不起作用。

例如,此代码应该将字符串中的所有 a 切换为 b,将所有 b 切换为 a 并打印结果。

输入:

abcd
a b
c d

预期输出:

badc

代码:

int main()
{
    int n, m, i, j;

    scanf("%d %d", &n, &m);

    char s[n+1], x[m+1], y[m+1];

    scanf("%s", s);

    for(i=0; i<m; i++)
    {
        scanf("%c", &x[i]);
        scanf("%c", &y[i]);
    }

    for(j = 0; j < m; j++)
    {
        for(i = 0; i<n; i++)
        {
            if(s[i] == x[j])
                s[i] = y[j];
            else if(s[i] == y[j])
                s[i] = x[j];
        }
    }

    printf("%s", s);

    return 0;
}

你的逻辑是正确的。您只需要在 scanf

两个 %c 说明符之前放置一个 space
for(i=0; i<m; i++)
{
    scanf(" %c", &x[i]);
    scanf(" %c", &y[i]);
}

它会起作用的。这是因为前一个 scanf 剩余的 \n 被第二个 scanf 读取,输入字符 a ba b 之间的 space 也发生了同样的情况c dscanf%c 之前的 space 将消耗所有白色-space。

您可以更改循环以仅在一次迭代中替换字符

for(i = 0; i < n; i++)
{
    for(j = 0; j < m; j++)
    {
        if(s[i] == x[j])
        {
            s[i] = y[j];
            break;
        }
        if(s[i] == y[j])
        {
            s[i] = x[j];
            break;
        }
    }
}

正如我评论的那样,您需要在这些行中的 %c 之前添加 space

scanf("%c", &x[i]);
scanf("%c", &y[i]);

以防止 %c 格式类型读取先前 scanf 调用留在输入缓冲区中的 white-space。改为

scanf(" %c", &x[i]);
scanf(" %c", &y[i]);

除了

代码不确保 s 是在打印时终止的空字符 - 导致未定义的行为。应该使用 for(i = 0; s[i] && i<n; i++) 来防止覆盖它。

这可能是过度使用时间的原因。


OP 在下面发帖作为输入。当然 scanf("%d %d", &n, &m);

前面必须有 2 个数字
abcd
a b
c d