我的程序需要打印所有的ABC,但我发现我的代码有问题。我该怎么办呢? (此时没有指针)。
代码中的运行时错误是什么以及如何解决?
以下是代码:
// Elvis’s hip and happening ABC-printing code
#include <stdio.h>
#include <string.h>
#define NUM_ABC_LET 26
void makeABC(char abc[NUM_ABC_LET]);
int main() {
char abcString[NUM_ABC_LET] = "";
makeABC(abcString);
puts(abcString);
return (0);
}
void makeABC(char abc[NUM_ABC_LET]) {
char letter;
for (letter = 'a'; letter <= 'z'; letter++) {
strcat(abc, letter);
}
}
答案 0 :(得分:1)
问题是strcat
函数希望两个参数都是(零终止)字符串。您只传递一个字符串,然后传递一个单个字符作为参数(这应该为您提供编译器警告)。
您需要将此单个字符转换为单个字符的字符串(或数组)。
并且不要忘记C中的字符串是零终止的。
使用单个字符作为strcat
函数的参数会发生什么情况是编译器将其转换为int
,然后转换为指针。这个问题是地址'a'
(例如)不是字符串的有效地址。这将导致未定义的行为和崩溃。
答案 1 :(得分:1)
你的程序逻辑是正确的,问题是调用strcat()
函数。 strcat()
函数实现为:
char *strcat(char *dest, const char *src)
{
char *ret = dest;
while (*dest)
dest++;
while (*dest++ = *src++);
return ret;
}
第二个参数必须是一个字符串,而不是传递一个字符。 这就是运行时错误的原因。
答案 2 :(得分:0)
你能尝试下面这样的事吗?我还没有对以下内容进行测试,但它应该在大多数情况下都有效。
// Elvis’s hip and happening ABC-printing code
#include <stdio.h>
#include <string.h>
#define NUM_ABC_LET 26
void makeABC(char abc[NUM_ABC_LET]);
int main()
{
char abcString[NUM_ABC_LET + 1];
makeABC(abcString);
puts(abcString);
return 0;
}
void makeABC(char abc[NUM_ABC_LET + 1])
{
char letter;
int i=0;
for(letter = 'a'; letter <= 'z'; letter++)
{
abc[i] = letter;
i++;
}
abc[i]='\0';
}
答案 3 :(得分:0)
您的计划有几个问题:
strcat
调用char
,您必须传递char *
个参数,指向空终止的C字符串。'\0'
终止符的字符数的大小来定义它。以下是更正后的版本:
#include <stdio.h>
#include <string.h>
#define NUM_ABC_LET ('z' - 'a' + 1) // 26 ASCII letters
void makeABC(char *abc); // makeABC receives a pointer to an array of char
// this declaration is equivalent to
// void makeABC(char abc[NUM_ABC_LET+1]);
// but less error prone
int main(void) {
char abcString[NUM_ABC_LET + 1] = "";
makeABC(abcString);
puts(abcString);
return 0;
}
void makeABC(char *abc) {
char letter;
char buf[2]; // a buffer for a 1 letter C string
for (letter = 'a'; letter <= 'z'; letter++) {
buf[0] = letter; // make a 1 letter string
buf[1] = '\0'; // set the null terminator
strcat(abc, buf);
}
}
答案 4 :(得分:0)
strcat的原型是 char * strcat(char * destination,const char * source);
意味着我们的源和目标应该而且必须是字符串,所以这就是为什么如果你在turbo c中编译它会导致错误
的问题“类型不匹配”。
如果您想编写用于打印ABC的程序,而不是简单地写
void main() {
int i;
for(i = 65; i<=90; i++)
{
printf("%c", i);
}
}
我希望你会喜欢......
答案 5 :(得分:0)
作为一个细微的变化,我建议将字符数组的长度传递给函数,这样函数就不会溢出数组。
当字符数组作为指针传递给函数时,函数不知道它的大小。
在你的情况下,你知道尺寸,但是对于未来,明确传递尺寸可能会更好。
此外,我只是复制了字符而不是使用strcat,并在最后添加了null终止。
#include <stdio.h>
#define NUM_ABC_LET 26
/* function takes pointer to array and size of array */
void makeABC(char *abc, int len);
int main()
{
/* array needs to include space for null termination */
char abcString[NUM_ABC_LET + 1];
/* call function with pointer + size */
makeABC(abcString, NUM_ABC_LET);
printf("%s\n", abcString);
return (0);
}
void makeABC(char *abc, int len)
{
int n;
for(n = 0; n < len; n++ ) {
/* add letters to the array */
abc[n] = n + 'a';
}
/* put a null termination on the end */
abc[n] = '\0';
}