簡體   English   中英

我試圖創建一個程序來反轉字符串,如果字符串是大寫的,我必須在 c 中將其更改為小寫,反之亦然

[英]im trying to create a program to reverse a string and if the string has uppercase i must change it to lowercase and vice versa in c

我試圖創建一個程序來反轉字符串,如果字符串是大寫的,我必須將其更改為小寫,反之亦然,但是當我使用 scanf[^\n] 時,它無法輸入任何內容。 輸入過程僅在第一次輸入時成功

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

int main() {
    int ctr1, ctr2, loop1, loop2;
    char char1[1010];
    char upp[1010], low[1010];
    int len;
    scanf("%d", &loop1);

    for (ctr1 = 0; ctr1 < loop1; ctr1++) {
        scanf("%[^\n]", char1);
        len = strlen(char1);
            
        for(ctr2=0;ctr2<len;ctr2++){
            upp[ctr2] = toupper(char1[ctr2]);
            low[ctr2] = tolower(char1[ctr2]);

            if (char1[ctr2] == low[ctr2]) {
                char1[ctr2] = upp[ctr2];
            }
            else if (char1[ctr2] == upp[ctr2]) { 
                char1[ctr2] = low[ctr2];
            }
        }
            
        printf("Case #%d: ", ctr1 + 1);
        
        for (ctr2 = len - 1; ctr2 >= 0; ctr2--) {
            printf("%c", char1[ctr2]);
        }
        
        printf("\n");
    }
}

scanf("%[^\n]",char1);

將讀取該行中的所有內容,除了行尾的換行符。 當您在下一次循環迭代中再次運行這行代碼時,它將什么也讀不到,因為換行符仍在輸入 stream 中。

因此,您還必須從輸入 stream 中刪除換行符。

一種簡單的方法是在每次scanf調用后對getchar進行額外調用。

另一種方法是指示scanf在嘗試匹配輸入之前刪除所有空白字符(包括換行符),如下所示:

scanf(" %[^\n]",char1);

但是,通常不建議使用scanf格式說明符%s%[]而不設置最大限制,因為可能會導致緩沖區溢出 因此,在你的情況下,寫起來會更安全

scanf(" %1009[^\n]",char1);

將匹配字符數限制為 1009,從而將寫入的總字節數限制為 1010(包括終止 null 字符)。 這樣,您可以確定不會越界寫入數組。

暫無
暫無

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

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