C初学者:需要解释“ideone”中的错误消息

时间:2016-10-11 16:02:19

标签: c

我正在尝试编写一个程序,接受语法错误的文本(长度不超过990个字符)作为输入,更正它,然后将更正的文本作为输出返回。我尝试使用在线编译器“ideone”运行程序,但它返回了一些我不太了解的错误。我已经发布了我的代码,以及下面的错误图片。任何人都可以向我解释这些错误到底是什么意思吗?

#include "stdio.h"

char capitalize(int i); //prototype for capitalize method

int main(void) 
{
   char userInput[1200]; //Array of chars to store user input. Initialized to 1200 to negate the possibility of added characters filling up the array.
   int i;                //Used as a counter for the for loop below.
   int j;                //Used as a counter for the second for loop within the first for loop below.
   int numArrayElements; 

   printf("Enter your paragraphs: ");
   scanf("%c", &userInput);   //%c used since chars are expected as input(?)
   numArrayElements = sizeof(userInput) / sizeof(userInput[0]);  //stores the number of elements in the array into numArrayElements.

   if (userInput[0] >= 97 && userInput[0] <= 122) //Checks the char in index 0 to see if its ascii value is equal to that of a lowercase letter. If it is, it is capitalized.
    userInput[0] = capitalize(userInput[0]);

   //code used to correct input should go here.
   for (i = 1; i < numArrayElements; i++)  //i is set to 1 here because index 0 is taken care of by the if statement above this loop
   {
    if (userInput[i] == 32)  //checks to see if the char at index i has the ascii value of a space.
        if (userInput[i + 1] == 32 && userInput[i - 1] != 46) //checks the char at index i + 1 to see if it has the ascii value of a space, as well as the char at index i - 1 to see if it is any char other than a period. The latter condition is there to prevent a period from being added if one is already present.
        {
            for (j = numArrayElements - 1; j > (i - 1); j--)  //If the three conditions above are satisfied, all characters in the array at location i and onwards are shifted one index to the right. A period is then placed within index i.
                userInput[j + 1] = userInput[j];

            userInput[i] = 46;  //places a period into index i.
            numArrayElements++; //increments numArrayElements to reflect the addition of a period to the array.

            if (userInput[i + 3] >= 97 && userInput[i + 3] <= 122)  //additionally, the char at index i + 3 is examined to see if it is capitalized or not.
                userInput[i + 3] = capitalize(userInput[i + 3]);
        }
   }

   printf("%c\n", userInput);  //%c used since chars are being displayed as output.
   return 0;
}

char capitalize(char c)
{
    return (c - 32); //subtracting 32 from a lowercase char should result in it gaining the ascii value of its capitalized form.
}

enter image description here

1 个答案:

答案 0 :(得分:0)

你的代码有几个问题,对初学者来说非常典型。回答你最后一个问题中的问题在于scanf()的工作方式:它将白名单之间的所有内容作为一个标记,因此它只在hey之后结束。我评论了我发现的其他问题的代码,而不是太挑剔。如果它们失败,这篇文章下面的评论可能会这样做。

#include "stdlib.h"
#include "stdio.h"
#include <string.h>

// Check for ASCII (spot-checks only).
// It will not work for encodings that are very close to ASCII but do not earn the
// idiomatic cigar for it but will fail for e.g.: EBCDIC
// (No check for '9' because non-consecutive digits are forbidden by the C-standard)
#if ('0' != 0x30) || ('a' != 0x61) || ('z' != 0x7a) || ('A' != 0x41) || ('Z' != 0x5a)
  #error "Non-ASCII input encoding found, please change code below accordingly."
#endif

#define ARRAY_LENGTH 1200

// please put comments on top, not everyone has a 4k monitor
//prototype for capitalize method
char capitalize(char i);

int main(void)
{
  //Array of chars to store user input. 
  // Initialized to 1200 to negate the possibility of
  // added characters filling up the array.

  // added one for the trailing NUL
  char userInput[ARRAY_LENGTH + 1];

  // No need to comment counters, some things can be considered obvious
  // as are ints called "i", "j", "k" and so on.
  int i, j;
  int numArrayElements;
  // for returns
  int res;

  printf("Enter your paragraphs: ");
  // check returns. Always check returns!
  // (there are exceptions if you know what you are doing
  // or if failure is unlikely under normal circumstances (e.g.: printf()))
  // scanf() will read everything that is not a newline up to 1200 characters
  res = scanf("%1200[^\n]", userInput);
  if (res != 1) {
    fprintf(stderr, "Something went wrong with scanf() \n");
    exit(EXIT_FAILURE);
  }
  // you have a string, so use strlen()
  // numArrayElements = sizeof(userInput) / sizeof(userInput[0]);
  // the return type of strlen() is size_t, hence the cast
  numArrayElements = (int) strlen(userInput);

  // Checks the char in index 0 to see if its ascii value is equal
  // to that of a lowercase letter. If it is, it is capitalized.

  // Do yourself a favor and use curly brackets even if you
  // theoretically do not need them. The single exception being "else if"
  // constructs where it looks more odd if you *do* place the curly bracket
  // between "else" and "if" 

  // don't use the numerical value here, use the character itself
  // Has the advantage that no comment is needed.
  // But you still assume ASCII or at least an encoding where the characters
  // are encoded in a consecutive, gap-less way
  if (userInput[0] >= 'a' && userInput[0] <= 'z') {
    userInput[0] = capitalize(userInput[0]);
  }

  // i is set to 1 here because index 0 is taken care of by the
  // if statement above this loop
  for (i = 1; i < numArrayElements; i++) {
    // checks to see if the char at index i has the ascii value of a space.
    if (userInput[i] == ' ') {
      // checks the char at index i + 1 to see if it has the ascii
      // value of a space, as well as the char at index i - 1 to see
      // if it is any char other than a period. The latter condition
      // is there to prevent a period from being added if one is already present.
      if (userInput[i + 1] == ' ' && userInput[i - 1] != '.') {
        // If the three conditions above are satisfied, all characters
        // in the array at location i and onwards are shifted one index
        // to the right. A period is then placed within index i.

        // you need to include the NUL at the end, too
        for (j = numArrayElements; j > (i - 1); j--) {
          userInput[j + 1] = userInput[j];
        }
        //places a period into index i.
        userInput[i] = '.';

        // increments numArrayElements to reflect the addition
        // of a period to the array.

        // numArrayElements might be out of bounds afterwards, needs to be checked
        numArrayElements++;
        if (numArrayElements > ARRAY_LENGTH) {
          fprintf(stderr, "numArrayElements %d out of bounds\n", numArrayElements);
          exit(EXIT_FAILURE);
        }
        // additionally, the char at index i + 3 is examined to see
        // if it is capitalized or not.

        // The loop has the upper limit at numArrayElements
        // i + 3 might be out of bounds, so check
        if (i + 3 > ARRAY_LENGTH) {
          fprintf(stderr, "(%d + 3) is out of bounds\n",i);
          exit(EXIT_FAILURE);
        }
        if (userInput[i + 3] >= 97 && userInput[i + 3] <= 122) {
          userInput[i + 3] = capitalize(userInput[i + 3]);
        }
      }
    }
  }
  printf("%s\n", userInput);
  return 0;
}

char capitalize(char c)
{
  // subtracting 32 from a lowercase char should result
  // in it gaining the ascii value of its capitalized form.
  return (c - ' ');
}