【问题标题】:Print ABC - string [closed]打印 ABC - 字符串 [关闭]
【发布时间】:2016-03-14 18:07:33
【问题描述】:
  1. 我的程序需要打印所有 ABC,但我发现我的代码有问题。我该如何解决? (这次没有指针)。

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

代码如下:

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

【问题讨论】:

  • char abcString[NUM_ABC_LET] 将不足以容纳 nul 终止符。您正在尝试连接 26 个“字母”,因此目标字符串大小必须至少为 27。
  • “什么是运行时错误”是什么意思?为什么你不知道它是什么?
  • "这次没有指针" - 错误的假设。如果不使用指针,您几乎无法在 C 中对数组执行任何操作。告诉您您遇到什么错误以及在哪里发生错误是您的责任!学习How to Ask
  • 编译器警告不仅仅是在编译期间显示一些花哨的消息!启用并注意它们。

标签: c arrays string


【解决方案1】:

问题在于strcat 函数要求两个 参数都是(以零结尾的)字符串。你只传递一个字符串,然后传递一个 单个字符 作为参数(这应该会给你编译器警告)。

您需要将这个单个字符转换成单个字符的字符串(或数组)。

别忘了 C 中的字符串是零结尾的。


使用单个字符作为strcat 函数的参数会发生什么情况,编译器会将其转换为int,然后再将其转换为指针。问题在于地址'a'(例如)不是字符串的有效地址。这将导致未定义的行为和崩溃。

【讨论】:

    【解决方案2】:

    你的程序逻辑是正确的,问题是strcat()函数的调用。 strcat() 函数实现为:

    char *strcat(char *dest, const char *src)
    {
     char *ret = dest;
     while (*dest)
        dest++;
     while (*dest++ = *src++);
     return ret;
    }
    

    第二个参数必须是一个字符串,而不是你传递一个字符。 这就是您的运行时错误的原因。

    【讨论】:

      【解决方案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 + 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';
      }
      

      【讨论】:

        【解决方案4】:

        您的程序有几个问题:

        • 您不能使用char 调用strcat,您必须传递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);
            }
        }
        

        【讨论】:

          【解决方案5】:

          strcat 的原型是 char *strcat(char *destination, const char *source);

          意味着我们的源和目的地应该并且必须是字符串,所以这就是为什么如果你在 turbo c 中编译它会出现错误

          “类型不匹配”。

          如果你想编写打印 ABC 到 Z 的程序,而不是简单地编写

          空主() {

            int i;
            for(i = 65; i<=90; i++)
            {
                printf("%c", i);
            }
          

          }

          希望你会喜欢......

          【讨论】:

            【解决方案6】:

            作为一个细微的变化,我建议将字符数组的长度传递给函数,这样函数就不会溢出数组。

            由于字符数组作为指针传递给函数,函数不知道它的大小。

            在您的情况下,您知道大小,但对于将来,明确传递大小可能会更好。

            另外我只是复制了字符而不是使用 strcat,并在末尾添加了空终止符。

            #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';
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-01
              • 1970-01-01
              • 2023-02-15
              • 1970-01-01
              • 2015-02-14
              相关资源
              最近更新 更多