我正在做一个程序来复制除前两个单词之外的所有字符串单词并在其末尾加上一个x。 但是我不能把x放在最后。请帮忙!!!! 以下是我的代码。
#include<stdio.h>
#include<string.h>
int main()
{
char a[25], b[25];
int i, j, count = 0, l, k;
scanf("%[^\n]s", a);
i = strlen(a);
if (i > 20)
printf("Given Sentence is too long.");
else
{/* checking for first 2 words and counting 2 spaces*/
for (j = 0; j < i; j++)
{
if (a[j] == ' ')
count = count + 1;
if (count == 2)
{
k = j;
break;
}
}
/* copying remaining string into new one*/
for (j = 0; j < i - k; j++)
{
b[j] = a[j + k];
}
b[j + 1] = 'x';
printf("%s", b);
}
}
答案 0 :(得分:0)
你的索引是一个人。在第二次循环后,条件SELECT
为false,因此j < i-k
现在 j
。因此,复制结束后的字符为i-k
,而不是b[j]
。因此,正确的行为b[j+1]
。
只需更改此内容即可为您留下 字符串的内容。 字符串被定义为b[j] = 'x';
的序列,以char
字符结尾。所以你 也要添加'\0'
。
完成这些更改后,您的代码会按预期执行,但仍然具有未定义的行为。
一个问题是,您的b[j+1] = 0;
会愉快地溢出缓冲区 - 在此处使用字段宽度:scanf()
。顺便说一下,scanf("%24[^\n]", a);
处于s
并且没有任何意义,您使用 s
转换或 {{1转换。
有些明智的实现会使用适合作业的功能,例如:这样:
[]
对于您不知道的功能,请使用Google #include<stdio.h>
#include<string.h>
int main(void)
{
// memory is *cheap* nowadays, these buffers are still somewhat tiny:
char a[256];
char b[256];
// read a line
if (!fgets(a, 256, stdin)) return 1;
// and strip the newline character if present
a[strcspn(a, "\n")] = 0;
// find first space
char *space = strchr(a, ' ');
// find second space
if (space) space = strchr(space+1, ' ');
if (space)
{
// have two spaces, copy the rest
strcpy(b, space+1);
// and append 'x':
strcat(b, "x");
}
else
{
// empty string:
b[0] = 0;
}
printf("%s",b);
return 0;
}
。
答案 1 :(得分:0)
你要删除前两个索引。但你写了k = j,如果你检查当前值j那里它是1.所以你错误地更新k因为你删除了2个索引。所以k值应该是2.所以检查下面的代码
/* copying remaining string into new one*/
for (j = 0; j < i - 2; j++)
{
b[j] = a[j + 2];
}
b[j + 1] = 'x';
printf("%s", b);
答案 2 :(得分:-1)
在C字符串中是你知道的字符数组,而C知道字符串结尾的方式是'\ 0'字符。在你的例子中,你在最后几行遗漏了
/* copying remaining string into new one*/
for(j=0;j<i-k;j++)
{
b[j]=a[j+k];
}
b[j+1]='x';
printf("%s",b);
循环结束后,j在退出循环之前已经增加了1。
因此,如果x之前的字符串是“test”,那就像 char数组中的't','e','s','t','\ 0',并且因为你的j增加得比它应该增加的多,所以它到达'\ 0'右边的点,但是'\ 0'之后的字符无关紧要,因为它是结束,所以你的x不会被添加。简单的改为
b[j]='x';