簡體   English   中英

我的C代碼中的邏輯錯誤

[英]Logic error in my C code

我有以下方法,該方法讀取兩個字符串來更改數據庫中兩個條目的名字和姓氏。 該名稱始終會轉換為小寫字母,並且只能使用帶有字母或連字符的名稱,除非連字符是字符串中的第一個或最后一個字符。 出現錯誤時,它僅再次提示用戶。

/*
Prompts for a student name, and checks if input is correct.
Returns 0 on success, -1 onEOF.
If the user inputs an invalid entry, the error is ignored and the user is simply asked again.
*/
int get_name(char *first, char *last)
{
char input[LINESIZE];
char buffer[LINESIZE];
char buffer2[LINESIZE];
int i;

while (1)
{
    printf("\n%s", "Enter the Student Name    ");
    if (!fgets(input, LINESIZE, stdin))
    {
        clearerr(stdin);
        return -1;
    }
    if (sscanf(input, "%s %s", buffer, buffer2) == 2)
    {
        if (strlen(buffer) < 20 && strlen(buffer2) < 20 && strlen(buffer) >= 2 && strlen(buffer2) >= 2) /*checks to see if the length is at least 2, but less than 20*/
        {
            for (i = 0; i < 20; i++) /*checks every character on the string, converts it to lower and then checks if it's a letter or a hyphen, restarts if not.*/
            {
                if (isalpha(buffer[i]))
                {
                    buffer[i] = tolower(buffer[i]);
                }
                if (isalpha(buffer2[i]))
                {
                    buffer2[i] = tolower(buffer2[i]);
                }
                if (!isalpha(buffer[i]) && buffer[i] != '-')
                {
                    break;
                }
                if (!isalpha(buffer2[i]) && buffer2[i] != '-')
                {
                    break;
                }
            }
            if (buffer[0] == '-' || buffer[(strlen(buffer) - 1)] == '-')
            {
                i = 0;
            }
            if (buffer2[0] == '-' || buffer2[(strlen(buffer2) - 1)] == '-')
            {
                i = 0;
            }
            if (i == 20)
            {
                sscanf(buffer, "%s", first);
                sscanf(buffer2, "%s", last);
                return 0;
            }
        }
    }
}

}

我已經使用(!isalpha(buffer[i]) && buffer[i] != '-')將錯誤跟蹤到了行,但是我不知道為什么該語句是錯誤的。

因此,例如,成功的輸入可以是“約翰·史密斯”或“霍姆·辛普森”。 在這兩種情況下,該函數均應返回0(成功)。 如果輸入類似:“ Denny's White”,“-alexa redfield”,“ albert”或“ 1234 5647”,則該功能應重新開始(再次提示用戶)。 此刻,無論輸入如何,功能都會重新開始。

程序中的主要邏輯錯誤是,您同時在兩個數組運行具有固定次數(20)的迭代的for循環。 您應該為名字和姓氏數組運行兩個單獨的循環。 另外,您應該只對每個數組的strlen運行這兩個循環。 請參閱以下示例:

for (i = 0; i < strlen(buffer); i++)
{
    /* your existing stuff for the "buffer" */
}

for (i = 0; i < strlen(buffer1); i++)
{
    /* your existing stuff for the "buffer1" */
}

注意: VHS是主要問題。 但是,這也指出了代碼中可以改進的結構性問題。 對於每個數組,幾乎所有代碼都是重復的。

創建一個可以在數組上操作的函數可能會(很可能)使問題更容易發現。

我對您的代碼進行了重新設計以添加此代碼[請原諒免費的樣式清理]:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define LINESIZE    80

int
bufdo(char *buf)
{
    int len;
    int idx;
    int chr;
    int ret;

    len = strlen(buf);

    do {
        // assume non-conforming
        ret = -1;

        // length too great
        if (len >= 20)
            break;

        // length too small
        if (len < 2)
            break;

        // begins with hyphen
        if (buf[0] == '-')
            break;

        // ends with hyphen
        if (buf[len - 1] == '-')
            break;

        // assume it will be okay
        ret = len;

        // convert to lowercase and check for bad chars
        for (idx = 0;  idx < len;  ++idx) {
            chr = buf[idx];

            if (isalpha(chr)) {
                chr = tolower(chr);
                buf[idx] = chr;
                continue;
            }

            // non-hyphen char in name
            if (chr != '-') {
                ret = -1;
                break;
            }
        }
    } while (0);

    return ret;
}

int
get_name(char *first, char *last)
{

    char input[LINESIZE];
    char buffer[LINESIZE];
    char buffer2[LINESIZE];
    int len1;
    int len2;
    int ret;

    ret = -1;

    while (1) {
        printf("\n%s", "Enter the Student Name    ");
        fflush(stdout);

        if (!fgets(input, LINESIZE, stdin)) {
            clearerr(stdin);
            break;
        }

        if (sscanf(input, "%s %s", buffer, buffer2) != 2)
            continue;

        len1 = bufdo(buffer);
        len2 = bufdo(buffer2);

        if ((len1 > 0) && (len2 > 0)) {
            strcpy(first,buffer);
            strcpy(last,buffer2);
            ret = 0;
            break;
        }
    }

    return ret;
}

暫無
暫無

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

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