运行C程序时出错

时间:2016-03-11 12:07:26

标签: 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_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;
}

2 个答案:

答案 0 :(得分:2)

  

strncat(abc,letter,NUM_ABC_LET);

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

对于您的情况,我认为最好使用snprintf。因此,您可以在循环中使用此代替strncat而不是{/ p>

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

答案 1 :(得分:0)

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

这里是strncat原型:

char *strncat(char *dest, const char *src, size_t n);

它将n个字符串从字符串(char *)复制到另一个字符

strncat对您的代码所做的是试图找到地址中的内容&#39; a&#39; (97) 并且发送了一个段错误,因为地址97不属于您的程序所以它崩溃了。 相反,你应该告诉他变量在哪里(例2) 最重要的是要了解内存如何在C中工作

为此目的你不需要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 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;
}