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 b
和 a b
之间的 space 也发生了同样的情况c d
。 scanf
中 %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
我不确定为什么这段代码不起作用。
例如,此代码应该将字符串中的所有 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 b
和 a b
之间的 space 也发生了同样的情况c d
。 scanf
中 %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);
abcd
a b
c d