【问题标题】:Error while running C program运行C程序时出错
【发布时间】:2016-03-11 12:07:25
【问题描述】:

我正在尝试制作一个将“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;
}

【问题讨论】:

  • 您在函数参数和返回类型中将charchar * 视为相同。了解它们之间的区别,您的问题应该得到解决。
  • 你是说代码编译没有错误?!如果没有,您不需要查找错误,因为编译器会为您找到它并告诉您要修复什么。如果您无法理解编译器告诉您的内容,请询问 that

标签: c string


【解决方案1】:

strncat(abc, 字母, NUM_ABC_LET);

问题在于您的 strncat,第二个参数必须是 const 字符串,但在这里您将其作为单个字符。

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

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

【讨论】:

    【解决方案2】:

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

    这里是 strncat 原型:

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

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

    strncat 对您的代码所做的是试图找到地址“a”处的内容 (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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      相关资源
      最近更新 更多