簡體   English   中英

C語言:更改用戶輸入

[英]C language: change user input

我需要編寫從用戶那里獲取Input程序,以防萬一我已經quate" ),我需要將quotes內的所有chars更改為uppercase

int main()
{
    int quoteflag = 0;
    int ch = 0;
    int i = 0;
    char str[127] = { '\0' };

    while ((ch = getchar()) != EOF && !isdigit(ch))
    {
        ++i;
        if (ch == '"')
            quoteflag = !quoteflag;

        if (quoteflag == 0)
            str[i] = tolower(ch);
        else
        {
            strncat(str, &ch, 1);
            while ((ch = getchar()) != '\"')
            {
                char c = toupper(ch);
                strncat(str, &c, 1);
            }

            strncat(str, &ch, 1);
            quoteflag = !quoteflag;
        }

        if (ch == '.')
        {
            strncat(str, &ch, 1);
            addnewline(str);
            addnewline(str);
        }
        else
        {
            if ((isupper(ch) && !quoteflag))
            {
                char c = tolower(ch);
                strncat(str, &c, 1);
            }
        }
    }

    printf("\n-----------------------------");
    printf("\nYour output:\n%s", str);
    getchar();

    return 1;
}

void addnewline(char *c)
{
    char tmp[1] = { '\n' };
    strncat(c, tmp, 1);
}

所以我的問題是,如果我的輸入是"a"此打印在末尾"A而不是"A" ,我不知道為什么

問題是您正在以奇怪的方式使用strncat 首先, strncat在big-endian系統上永遠不會做任何事情。 strncat作用是將輸入...讀取為字符串 因此,將int (四個或八個字節)傳遞給該函數,它將讀取第一個字節。 如果第一個字節為0 ,則它將認為它是字符串的結尾,並且不會str添加任何內容。 在小端系統上,第一個字節應該是您想要的char ,但是在大端系統上,它應該是高字節(對於一個int ,該值小於255的值將始終為零)。 您可以在此處閱讀有關字節序的更多信息

不過,我不知道為什么要使用strncat附加單個字符。 您使用str[i] = tolower(ch)有了正確的主意。 我將int ch更改為char ch ,然后經過檢查,並在代碼中將strncat(...)替換為str[i++] = ... ,它編譯良好並返回了所需的"A"輸出。 源代碼如下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int quoteflag = 0;
    char ch = 0;
    int i = 0;
    char str[127] = { '\0' };

    while ((ch = getchar()) != EOF && !isdigit(ch))
    {
        if (ch == '"')
            quoteflag = !quoteflag;

        if (quoteflag == 0)
            str[i++] = tolower(ch);
        else
        {
            str[i++] = ch;
            while ((ch = getchar()) != '\"')
            {
                char c = toupper(ch);
                str[i++] = c;
            }
            str[i++] = ch;
            quoteflag = !quoteflag;
        }

        if (ch == '.')
        {
             str[i++] = '.';
             str[i++] = '\n';
             str[i++] = '\n';
        }
        else
        {
            if ((isupper(ch) && !quoteflag))
            {
                char c = tolower(ch);
                str[i++] = c;
            }
        }
    }

    printf("\n-----------------------------");
    printf("\nYour output:\n%s", str);
    getchar();

    return 1;
}

您應該刪除++i; 行,然后更改:

str[i] = tolower(ch);

至:

str[i++] = tolower(ch);

否則,由於您是預遞增的,因此,如果您的第一個字符不是"而是說a ,則您的字符串將為\\0a\\0\\0...這將導致我們a下一個問題:

strncat(str, &ch, 1);

如果輸入是a" ,則strncat(str, &'"', 1); 將給出\\"\\0\\0...的結果,因為strncat會將str視為空字符串。將所有出現的內容替換為上面的內容:

str[i++] = toupper(ch);

(當您傳入格式錯誤的字符串時, strncat()在技​​術上也可能是未定義的行為,但對於語言律師而言,這就是一種)

這將跟蹤索引,否則一旦退出報價循環,您的第一個str[i] = tolower(ch); 將開始覆蓋引號中的所有內容。

暫無
暫無

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

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