将改变字符串的单词连接到猪拉丁语中

时间:2015-07-18 02:43:20

标签: c string segmentation-fault

我一直收到“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;
}

3 个答案:

答案 0 :(得分:1)

  

如何将用户输入的给定单词的第一个字母交换到单词的结尾,然后添加“ay”

  1. 保存第一个字符(“letter”)

    char c = pig[0];
    
  2. pig一个char的其余部分移至开头

    memmove(pig, pig + 1, strlen(pig) - 1); 
    

    交替使用此声明

    memmove(&pig[0], &pig[1], strlen(pig) - 1);
    

    (请注意,memcpy()在此处不起作为源和destiantion重叠。)

  3. 将“旧”的最后一个字符替换为“旧”,存储的第一个字符

    pig[strlen(pig) - 1] = c;
    
  4. 附加"ay"

    strcat(pig, "ay");
    
  5. 打印结果:

    printf("%s\n", pig);
    
  6. 不需要第二个“字符串”,char - 数组。

    假设pig足够大,比从用户扫描的数据大一char,甚至可以省略使用中间字符`c,如我的草图上方。

    1. pig初始化为所有0 s

      char pig[100] = "";
      
    2. 扫描数据

      scanf("%98s", pig); /* Add tests for failure reading as needed. */
      
    3. 附加输入的第一个字符,即将其复制到pig

      的末尾
      pig[strlen(pig)] = pig[0];
      
    4. 将所有pig个字符移至开头

      memmove(pig, pig + 1, strlen(pig) - 1);
      
    5. 打印结果:

      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.