打印ABC - 字符串

时间:2016-03-14 18:07:34

标签: c arrays string

  1. 我的程序需要打印所有的ABC,但我发现我的代码有问题。我该怎么办呢? (此时没有指针)。

  2. 代码中的运行时错误是什么以及如何解决?

  3. 以下是代码:

    // 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);
        }
    }
    

6 个答案:

答案 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';
}