簡體   English   中英

小C程序不起作用

[英]small C program doesnt work

我試圖制作一個程序來獲取用戶輸入(行),並打印出超過80個字符的最長行。 我編寫了程序,但是運行它時,它輸出了一些非常奇怪的符號。 您能告訴我我的代碼可能出什么問題嗎?

#include <stdio.h>
#define MINLINE 80
#define MAXLINE 1000

int getline(char current[]);
void copy(char from[], char to[]);

int main(void)
{
    int len; // current input line lenght
    int max; // the lenght of a longest line that's over 80 characters
    char current[MAXLINE]; // current input line
    char over80[MAXLINE]; // input line that's over 80 characters long

    while (len = (getline(current)) > 0) {
        if (len > MINLINE) {
            max = len;
            copy(current, over80);
        }
    }

    if (max > 0) {
        printf("%s", over80);
    }
    else {
        printf("No input line was over 80 characters long");
    }

    return 0;
}

int getline(char current[]) {
    int i = 0, c;
    while (((c = getchar()) != EOF) && c != '\n') {
        current[i] = c;
        ++i;
    }

    if (i == '\n') {
        current[i] = c;
        ++i;
    }

    current[i] = '\0';

    return i;
}

void copy(char from[], char to[]) {
    int i = 0;
    while ((to[i] = from[i]) != '\0') {
        ++i;
    }
}

非常感謝您的幫助 !

如果找不到長行,則無法初始化max 然后在if (max > 0)使用它是未定義的行為。

這行:

  while (len = (getline(current)) > 0) {

(getline(current)) > 0)的值分配給len ,這不是您想要的(之后len將為0或1。

編輯:剛看到AusCBloke的評論,您還應該同時檢查len > max len > MINLINE否則您將得到的最新len > MINLINE於80個字符,而不是最長的len > MINLINE

您還應該將max初始化為0,因此應為

  max = 0;
  while ((len = getline(current)) > 0) {
    if ((len > MINLINE) && (len > max)) {

其他小錯誤/提示:

  • 內置函數strcpystrncpy執行copy功能,而無需重新設計輪子。
  • 在您的getline函數中,使用MAXLINE防止緩沖區溢出。

假設這是一項家庭作業,這是一個提示:這段代碼看起來非常可疑:

if (i == '\n') {
    current[i] = c;
    ++i;
}

由於i代表一個位置並且從未分配過字符,因此您可以有效地檢查該位置是否等於ASCII代碼'\\n'

您的復制方法不能為null終止字符串:

void copy(char from[], char to[]) {
    int i = 0;
    while ((to[i] = from[i]) != '\0') {
        ++i;
    }
    to[i] = '\0'
}

這可能解釋了正在打印的怪異字符。

您可以使用內置的strcpy()使生活更輕松。

如果您提供的輸入數據行數超過1000個字符,則固定大小的緩沖區將溢出。 通過輸入這樣的輸入,我可以實現以下輸出:

╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠

我目前無法測試您的代碼,但這可能是由於未清除字符數組引起的。 嘗試將char數組設置為0。

您的代碼有很多問題。 大多數情況下,這是由於車輪的重新發明。

int getline(char current[]);

您不需要定義自己的getline()stdio.h已經有一個。

void copy(char from[], char to[]);

還有許多用於在string.h復制字符串的函數。

初始化所有0f變量也是一個好主意,如下所示:

    int len = 0; // current input line length

...這可以防止以后出現問題,例如在未初始化時與max進行比較。

如果您這樣初始化max ...

    int max = MINLINE; // the length of a longest line that's over 80 characters

...然后,以后進行長度比較會更容易。

    char* current = NULL;
    size_t allocated = 0;

如果currentNULL ,則getline()將分配用於存儲行的緩沖區,該緩沖區應由用戶程序free getline()還使用一個指向size_t的指針,該指針包含存儲行所需的字節數。

    while (len = (getline(current)) > 0) {

應該由以下內容代替...

    while ((len = getline(&current, &allocated, stdin)) > 0) {

...更新並比較len0

現在,而不是...

        if (len > MINLINE) {

...您需要與我們早先初始化的最后最長線進行比較...

        if (len > max) {

...然后您就可以像以前那樣更新max ...

            max = len;

在調用copy()使用strncpy() ,這將防止您在分配的緩沖區中寫入超過1,000個字符:

            strncpy(over80, current, MAXLINE);

由於我們初始化了max ,因此您需要在末尾將檢查從if (max > 0)更改為if (max > MINLINE)

另一個提示,更改以下行...

        printf("No input line was over 80 characters long");

...至...

        printf("No input line was over %d characters long", MINLINE);

...將意味着您只需要更改文件頂部的#define即可增加或減少最小長度。

別忘了...

    free(current);

...以防止內存泄漏!

暫無
暫無

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

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