簡體   English   中英

當我在代碼頂部添加for循環時,程序崩潰。 為什么?

[英]When I add a for loop to the top of my code, my program crashes. Why?

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

int main(void)
{
    //int num_of_signs,x;
    //scanf("%d", &num_of_signs);
    //for (x=0; x<num_of_signs; x++){
        int num_of_chars, i;
        char sign[30], two_sign[60];
        fgets(sign, sizeof(sign), stdin);
        scanf("%d", &num_of_chars);

        sign[strlen(sign) - 1] = '\0'; // discard '\n'
        strcpy(two_sign, sign);
        strcat(two_sign, sign);
        for (i = 0; sign[num_of_chars + i]; i++){
        printf("[%.*s]\n", num_of_chars, two_sign + i);
        }
   // }
    return 0;
}

沒有for循環的原始代碼執行此操作:

Input: 
Hello World!
5

Output:
[Hello]
[ello ]
[llo W]
[lo Wo]
[o Wor]
[ Worl]
[World]
[orld!]
[rld! ]
[ld! H]
[d! He]
[! Hel]

當我添加循環以使用多個輸入執行此操作時,我的程序崩潰。 具體來說,在我輸入第一個要用作符號的字符串后,它崩潰了。 我不知道為什么...

我想要它是這樣的:

Input:  
3
Hello World!
5
Farewell
10
Sad
2



Output: 
Sign #1:
[Hello]
[ello ]
[llo W]
[lo Wo]
[o Wor]
[ Worl]
[World]
[orld!]
[rld! ]
[ld! H]
[d! He]
[! Hel]

Sign #2:
[Farewell ]

Sign #3:
[Sa]
[ad]
[d ]
[ S] 
    scanf("%d", &num_of_chars);

將換行符留在流中。 因此,對fgets的下一次調用將返回僅包含換行符的行。

之后,您需要添加代碼以忽略該行的其余部分。

添加功能

void ignoreRestOfLine(FILE* fp)
{
   int c;
   while ( (c = fgetc(fp)) != EOF && c != '\n');
}

並在上述scanf行之后立即調用它:

ignoreRestOfLine(stdin);

另外,在繼續使用應該讀入的數據之前,請始終檢查對fgetsscanf調用是否成功。

更改

    fgets(sign, sizeof(sign), stdin);
    scanf("%d", &num_of_chars);

    if ( fgets(sign, sizeof(sign), stdin) == NULL )
    {
       // Deal with error.
    }

    if ( scanf("%d", &num_of_chars) != 1 )
    {
       // Deal with error.
    }

    // Skip rest of the line
    ignoreRestOfLine(stdin);

暫無
暫無

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

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