我一直收到“Segmentation fault(core dumped)”。 如何将用户输入的给定单词的第一个字母交换到单词的结尾,然后添加“ay”。 例如: 输入“代码” 输出“odecay”
#include<stdio.h>
#include<string.h>
int main()
{
char pig[100],p[10],i[100];
int j,length;
printf("What word would you like to change into pig latin");
scanf("%s",pig);
length=strlen(pig);
strcat(p,pig[0]);
for(j=0;j<length;j++)
{
pig[j]=pig[j+1];
}
strcat(pig,p);
strcat(pig,"ay");
printf("%s",pig);
return 0;
}
答案 0 :(得分:1)
如何将用户输入的给定单词的第一个字母交换到单词的结尾,然后添加“ay”
保存第一个字符(“letter”)
char c = pig[0];
将pig
一个char
的其余部分移至开头
memmove(pig, pig + 1, strlen(pig) - 1);
交替使用此声明
memmove(&pig[0], &pig[1], strlen(pig) - 1);
(请注意,memcpy()在此处不起作为源和destiantion重叠。)
将“旧”的最后一个字符替换为“旧”,存储的第一个字符
pig[strlen(pig) - 1] = c;
附加"ay"
strcat(pig, "ay");
打印结果:
printf("%s\n", pig);
不需要第二个“字符串”,char
- 数组。
假设pig
足够大,比从用户扫描的数据大一char
,甚至可以省略使用中间字符`c,如我的草图上方。
将pig
初始化为所有0
s
char pig[100] = "";
扫描数据
scanf("%98s", pig); /* Add tests for failure reading as needed. */
附加输入的第一个字符,即将其复制到pig
pig[strlen(pig)] = pig[0];
将所有pig
个字符移至开头
memmove(pig, pig + 1, strlen(pig) - 1);
打印结果:
printf("%s\n", pig);
答案 1 :(得分:0)
此代码运行但您的算法存在轻微问题。由于这可能是作业,我会让你想出那部分。
#include <stdio.h>
#include <string.h>
int main()
{
// These should be initialized before use.
char pig[100] = "",
char p[10] = "";
printf("What word would you like to change into Pig Latin: ");
scanf("%s", pig);
unsigned long length = strlen(pig); // strlen returns an unsigned long
strcat(p, &pig[0]); // This needs a pointer to char
for(int j = 0; j < length; j++)
{
pig[j] = pig[j + 1];
}
strcat(pig, p);
strcat(pig, "ay");
printf("%s", pig);
return 0;
}
输入:
代码
输出:
odeCodeay
正如我所说,算法不太对,但现在代码运行你应该能够很快修复它。此外,由于您不熟悉编程,请注意一些代码格式,使其更具可读性。
修改强>
由于其他人已经提及它,将行strcat(p, &pig[0]);
更改为strncat(p, pig, 1);
将产生所需的输出并仍然使用您的原始算法。
答案 2 :(得分:-1)
strcat(p,pig[0]); // segmentation fault may happen in this line.
char *strcat(char *dest, const char *src) // takes two string but you are passing pig[0] in the second argument which is char
您可以使用char *strncat(char *dest, const char *src, size_t n)
因此,将char
连接到string
的正确方法是
strncat(p,&pig[0],1); // where 1 is passed in the third argument
//so that it reads only 1 char i.e. pig[0] and ignore next characters
// otherwise the whole pig string will be concatenated.