C语言 当我在代码顶部添加 for 循环时,我的程序崩溃了.为什么


#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] = ''; // 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);

最新更新