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