Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行C程序时出错_C_String - Fatal编程技术网

运行C程序时出错

运行C程序时出错,c,string,C,String,我正在尝试制作一个程序,将“abc”插入到字符串中。 这个代码有什么问题?我找不到错误 // Elvis’s hip and happening ABC-printing code #include <stdio.h> #include <string.h> #define NUM_ABC_LET 27 char makeABC(char abc[NUM_ABC_LET]); int main(void) { char abcString[NUM_ABC_L

我正在尝试制作一个程序,将“abc”插入到字符串中。 这个代码有什么问题?我找不到错误

// Elvis’s hip and happening ABC-printing code

#include <stdio.h>
#include <string.h>

#define NUM_ABC_LET 27
char makeABC(char abc[NUM_ABC_LET]);

int main(void)
{
    char abcString[NUM_ABC_LET] = "";

    makeABC(abcString);

    puts(abcString);

    return (0);
}

char makeABC(char abc[NUM_ABC_LET])
{
    char letter = ' ';

    for (letter = 'a'; letter <= 'z'; letter++)
    {
        strncat(abc, letter, NUM_ABC_LET);
    }

    return abc;
}
//猫王的臀部和ABC打印代码
#包括
#包括
#定义NUM_ABC_LET 27
char makeABC(char abc[NUM_abc_LET]);
内部主(空)
{
char abcString[NUM_ABC_LET]=“”;
makeABC(abcString);
put(abcString);
返回(0);
}
char makeABC(char abc[NUM\u abc\u LET])
{
字符字符='';
for(字母='a';字母
strncat(abc、字母、数字)

问题在于您的
strncat
,第二个参数需要是常量字符串,但在这里,它是一个字符

对于您的情况,我认为最好使用
snprintf
。因此,您可以在循环中使用以下内容,而不是
strncat

int pos = letter - 'a';
snprintf(abc + pos, NUM_ABC_LET - pos, "%c", letter);

您正在传递给
strncat
一个字符而不是char*(一个字符而不是它的地址)

以下是strncat原型:

char *strncat(char *dest, const char *src, size_t n);
它将
n
字符从一个字符串(char*)复制到另一个字符串

strncat对您的代码所做的是尝试查找地址“a”(97)中的内容 并向您发送了一个segfault,因为地址97不属于您的程序,所以它崩溃了。 相反,您应该告诉他变量在哪里(示例2) 最重要的是理解C语言中内存是如何工作的

为此,您不需要strncat,因此这里是一个没有strncat的版本:

char makeABC(char abc[NUM_ABC_LET])
{
  int   x;

  x = 0;
  while (x < NUM_ABC_LET)
    {
      abc[x] = x + 'a';
      x += 1;
    }
  return abc;
}

您在函数参数和返回类型中对待
char
char*
是一样的。了解它们之间的区别,您的问题应该得到解决。您是说代码编译时没有错误吗?如果没有,您不需要找到错误,因为编译器会帮您找到错误并告诉您如何修复。如果您在理解编译器告诉您的内容时遇到困难,然后询问一下。
char makeABC(char abc[NUM_ABC_LET])
{
  char letter = ' ';

  for (letter = 'a'; letter <= 'z'; letter++)
    {
      strncat(abc + letter - 'a', &letter, 1);
    }

  return abc;
}
char makeABC(char abc[NUM_ABC_LET])
{
  strncat(abc, "abcdefghijklmnopqrstuvwxyz", NUM_ABC_LET);
  return abc;
}