C中的字符串输入/输出

时间:2017-03-03 22:42:40

标签: c string

我需要打印一个字符串的所有偶数索引,然后是空格,然后是字符串的所有奇数索引。我可以输入与字符串N一样多的数字。每个新字符串将在输出中的新行上提供上述条件。

以下是我的代码,你能说明我错在哪里吗?

int main() {

    int i;
    int N;
    char str[10000];
    scanf("%d",&N);
    while(N>0)
        {
        scanf("%s",str);
        for(i=0; str[i] != '\0'; i++)
            {
            if((i%2)== 0)
                {
                printf("%c",str[i]);
            }

            else if((i%2)==1)
                {

                printf("%c",str[i]);
            }
        }
        printf("\n");
        N--;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:-1)

你只需要另一个这样的循环

#include<stdio.h>

int main(int argc, char** argv) {

int i, N;
char str[10000];
scanf("%d", &N);

printf("%d\n", N);
while (N > 0) {
    scanf("%s", str);
    printf("%s\n", str);

    // Even Indcies:
    for (i = 0; str[i] != '\0'; i++) {
        if (i % 2 == 0) {
            printf("%c", str[i]);
        }
        //printf("%d", i);
    }

    printf(" ");

    //Odd Indices
    for (i = 1; str[i] != '\0'; i++) {
        if (i % 2 == 1) {
            printf("%c", str[i]);
        }
        //printf("%d", i);
    }

    printf("\n");
    N--;
}
}

在回应@ StoryTeller的评论时,请考虑以下C代码

#include<stdio.h>

int main() {

int i, N;
char str[10000];
scanf("%d", &N);


while (N > 0) {
    scanf("%s", str);
    //printf("%s\n", str);

    // Even Indcies:
    for (i = 0; str[i] != '\0'; i+=2) {
        printf("%c", str[i]);
        //printf("%d", i);
    }

    printf(" ");

    //Odd Indices
    for (i = 1; str[i] != '\0'; i+= 2) {
        printf("%c", str[i]);
        //printf("%d", i);
    }

    printf("\n");
    N--; 
}

如果我在提示时输入以下参数:

2
reallylonginput
short

然后我实际得到以下输出:

rallnipt elyognu
sotlnipt hr

第一个工作正常,正如我们所期望的那样。但是,第二个包含在第一个群集上没有意义的字符,即 lnipt 。要了解为什么会发生这种情况,我们必须仔细研究str变量。

调用第一个scanf时,输入写入str,str看起来像

| r | e | a | l | l | y | l | o | n | g | i | n | p | u | t | \0 | \0 | \0 | ...

所以第一次输入的循环很好。但是当我们在下一个输入中读取时,str看起来像

| s | h | o | r | t | \0 | l | o | n | g | i | n | p | u | t | \0 | \0 | ...

它只会覆盖所需的内容,并保持其他所有内容不受影响。由于第一个循环只扫描偶数索引,因此它会错过第一个\ 0并继续运行。因此,两个索引不起作用。