簡體   English   中英

我的程序無法正確輸出行

[英]My program can't output the lines correctly

我在 C 方面相對較新,目前正在閱讀 Kernighan 的書。 本書中的一個問題是創建一個算法,如果輸入行超過 10 個字符,則從該行輸出該行。

關鍵是我很沮喪,因為我找不到我的代碼有什么問題。 我調試並重新創建了很多次,但仍然無法找出發生了什么!

函數getl()的轉義字符是 '.' (點),有時有效,有時則無效。 如果你編譯它並測試你會看到:

gcc -Wall -o out 'script.c'

書中的問題標題是:

“練習 1-17。 編寫一個程序來打印所有超過 10 個字符的輸入行。”

我確信這相對容易,但我真的很想知道為什么這個算法沒有按預期工作,我認為它與 '\\n' 有關。

如果有人能幫我找出代碼的問題,我將不勝感激。

代碼

#include <stdio.h>

#define MAX 10000

int getl(char line[], int lim) {
    char c;
    int count;

    for (count = 0 ; count < lim-1 && (c = getchar()) != '.' ; count++) {
        if (c == '\n') {
            line[count] = '\n';
            count++;
            break;
        }
        line[count] = c;
    }
    line[count] = '\0';
    return count;
}
    
int main() {
    char line[MAX];
    int len = 1;

    for (; len > 0 ;) {
        getl(line, MAX);
        len = getl(line, MAX);
        if (len >= 10)
            printf("%s", line);
    }
    return 0;
}

你的代碼幾乎可以工作。 您似乎只是在這里和那里有一些重復的行,使事情變得混亂。

具體來說,您正在調用getl(line, MAX); 連續兩次。 第一個獲取輸入,但不保存計數,第二個只有一個空的 stdin 緩沖區可以使用,因此不會從中保存合理的計數。 刪除不保存計數的第一個調用可以解決您的問題。

#include <stdio.h>

#define MAX 10000

int getl(char line[], int lim) {
    char c = getchar();
    int count;
    
    for (count = 0 ; c != '.' ; count++) {
        line[count] = c;
        c = getchar();
    }
    line[count++] = '\n';
    return count;
}
    
int main() {
    char line[MAX];
    int len = 1;
    for (; len > 0 ;) {
        len = getl(line, MAX);
        if (len >= 10)
            printf("%s", line);
    }
    return 0;
}

首先,您調用 getl 函數兩次而不是一次(您只想一行一行地讀取行)。 修復它應該有效。 然后我認為您不應該將尾隨的 '\\n' 添加到您的行中,只需在您的行長於 10 個字符時打印它,在您的代碼中,'\\n' 將被視為一個字符。

這是修改后的代碼:

#include <stdlib.h>
#include <stdio.h>
#define MAX 10000

int getl(char line[])
{
    char    c;
    int     count;

    for (count = 0; count < MAX - 1 && (c = getchar()) != '.' ; count++)
    {
        if (c == '\n')
            break;
        line[count] = c;
    }
    line[count] = '\0';
    return (count);
}

int main()
{
    char    line[MAX];
    int     len = 1;

    while (len > 0)
    {
        len = getl(line);
        if (len >= 10)
            printf("%s, c = %i\n", line, len);
    }
    return (0);
}

這應該有效。 https://ideone.com/cXXRUH

#include <stdio.h>

#define MAX 10000

int getline_length(char line[]) {
  char ch;
  int count = 0;

  printf("\nWaiting for INPUT...");
  // Using clear while loop to get input, removing redundent complexity 
  // Either `.` or `\n` consider End Of Line 
  while(count < MAX-1 && ((ch = getchar()) != '.' || (ch = getchar()) != '\n')) {
      line[count++]=ch;
  }
  line[count] = '\0';
  return count;
}

int main() {
   char line[MAX];

   while(1) {
       // reset array before each input 
       memset(line, 0, sizeof(line));
       int len = getline_length(line); //No need to pass limit 
       if (len >= 10) {
           printf("%s", line);
        } else {
            printf("len < 10");
        }
   }
   return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM