سؤال

وأنا القراءة على K & R الكتاب، وأنا عالقة قليلا.

ما هو الخطأ في ما يلي؟

void getInput(int* output) {
   int c, i;
   for(i=0; (c = getchar()) != '\n'; i++)
     output[i] = c; // printf("%c", c) prints the c value as expected
   output[++i] = '\0';
}

وعند تشغيل البرنامج فإنه لم يخرج من حلقة ويجب أن السيطرة + C للخروج. ولكن إذا كان يمكنني استبدال السطر الخامس مع printf("%c", c);، فإنه يطبع من كل المدخلات على ما يرام بعد ضرب دخول وإقامة خط جديد.

هل كانت مفيدة؟

المحلول

<اقتباس فقرة>   

ما هو الخطأ في ما يلي؟

1. void getInput(int* output) {

لماذا هو حجة إدخال عدد صحيح * عند ما كنت تريد تخزين في مجموعة من الشخصيات؟ ربما

void getInput(char* output) {

وهو أفضل.

وأيضا، كيف يمكنك أن تعرف أن مؤشر الناتج يشير في مكان ما حيث كنت تحمل ذاكرة كافية لكتابة إدخال المستخدم؟ ربما يجب أن يكون الحد الأقصى لطول المخزن المؤقت كمعلمة إضافية لتجنب الأخطاء تجاوز سعة المخزن المؤقت كما أشار PW خارج .

5.   output[++i] = '\0';

لقد تم بالفعل بمقدار لي الوقت الاضافي داخل لحلقة، لذلك يمكنك القيام به فقط:

output[i] = '\0';

وبخلاف هذه، البرنامج يعمل بشكل جيد وإخراج ما المدخلات حتى العودة.

وFWIW، اختبرته عن طريق استدعاء مثل ذلك:

 int main(void)
{
    char o[100];
    getInput(o);
    printf("%s", o);
    return 0;
}

نصائح أخرى

ويبدو الصحيح بالنسبة لي كما هو مكتوب إلا أنك لا تحتاج إلى زيادة ط خارج الحلقة. ط يحصل يتزايد الحق قبل إنهاء الحلقة، وبالتالي هو بالفعل المكان الذي تريده.

تأكد من أن '\ ن' تبذل فعلا إلى ج.

في بعض الأحيان إلى '\ ن' سوف تحصل على هدره كما هو محدد.

وكود الاخيرة كما شارك ديك 3 أخطاء أستطيع أن أرى:

char* userInput[MAX_INPUT_SIZE];

ويجب أن تكون:

char userInput[MAX_INPUT_SIZE+1];

و(هذا كان بالفعل باكس ديابلو المذكورة)

getInput(&userInput);

ويجب أن تكون:

getInput( userInput );

وهذا الخطأ الأخير يعني أنك تمريرها إلى getInput عنوان داخل كومة المكالمة. لديك الكتابة الذاكرة. على الارجح واحدة من مكالماتك إلى getchar () returnes إلى عنوان خاطئ.

وطريقة بسيطة لخطر تجاوز سعة المخزن المؤقت، لأنه يتم تمرير حجم الانتاج أبدا / فحص

هل حاولت استخدام مصحح؟ يجب أن الخطوة خلال التعليمات البرمجية في جدب أو استوديو البصرية أو ما كنت تستخدم ونرى ما يجري. قلت لك كان مبتدئا لذلك ربما كنت قد لا يعتبر ذلك حتى الآن - وهذا هو أسلوب التصحيح طبيعية جدا لاستخدام

وهنا هو البرنامج الكامل مع اثنين من التحديثات من المدخلات الخاصة بك، لكنه لا يزال لن تجعل من الحلقة. راجع للشغل كان هذا التمرين 1-24 على خريج 34

#include <stdio.h>

#define STACK_SIZE 50
#define MAX_INPUT_SIZE 1000
#define FALSE 0
#define TRUE 1

void getInput();
int validInput();

int main() {
  char* userInput[MAX_INPUT_SIZE];

  getInput(&userInput);

  if (validInput(&userInput) == TRUE)
    printf("Compile complete");
  else
    printf("Error");
}

// Functions
void getInput(char* output) {
  int c, i;
  for(i=0; (c = getchar()) != '\n' && c != EOF && i <= MAX_INPUT_SIZE; i++)
    output[i] = c;
  output[i] = '\0';
}

int validInput(char* input) {
  char stack[STACK_SIZE];
  int c;
  int j;

  for (j=0; (c = input[j]) != '\0'; ) {
    switch(c){
      case '[': case '(': case '{':
        stack[j++] = c;
        break;
      case ']': case ')': case '}':
        if (c == ']' && stack[j] != '[')
          return FALSE;
        else if (c == '}' && stack[j] != '{')
          return FALSE;
        else if (c == ')' && stack[j] != '(')
          return FALSE;

        // decrement the stack's index  
        --j;
        break;
    }
  }

  return TRUE;
}

وهنا هو رمز العمل النهائي. يجب أن أقول أنني التقطت قدرا كبيرا من فعل هذا واحد. شكرا للمساعدة والمؤشرات.

وأي اقتراحات بشأن الكيفية التي يمكن أن تتم الأمور بشكل أفضل؟

#include <stdio.h>

#define STACK_SIZE 50
#define MAX_INPUT_SIZE 1000
#define FALSE 0
#define TRUE !FALSE

void get_input();
int valid_input();

int main() {
  char user_input[MAX_INPUT_SIZE + 1]; // +1 for the \0

  get_input(user_input);

  if (valid_input(user_input))
    printf("Success\n");
  else
    printf("Error\n");
}

// Functions
void get_input(char* output) {
  int c, i;
  for(i=0; (c = getchar()) != '\n' && c != EOF && i <= MAX_INPUT_SIZE; i++)
    output[i] = c;
  output[i] = '\0';
}

int valid_input(char* input) {
  char stack[STACK_SIZE];
  char c;
  int i = 0;
  int stack_index = -1;

  while ((c = input[i]) != '\0' && i < STACK_SIZE) {
    switch(c){
      case '[': case '(': case '{':
        stack_index++; 
        stack[stack_index] = c;
        break;
      case ']': case ')': case '}':
        if ((c == ']' && stack[stack_index] != '[') ||
            (c == '}' && stack[stack_index] != '{') ||
            (c == ')' && stack[stack_index] != '('))
          return FALSE;

        // decrement the stack's index now that the closing bracket is found  
        stack_index--;
        break;
    }
    i++;
  }

  // stack index should be back where it started
  return (stack_index == -1);
}
scroll top