Scanf(“%[^ \ n]”)不在循环内使用数组字符串

时间:2016-03-01 19:09:41

标签: c arrays string multidimensional-array scanf

我在C中编写了这段代码。我需要解决一个问题,我必须输入5行字符串,包括空格。这个程序只给我输出所有5行字符串,包括空格。通过空格我的意思是在输入中我可以放置空格之前和char或任何char之后。这就是我写这段代码的原因,但我不明白为什么它不起作用。

#include<stdio.h>
int main() {
    char str[5][100];
    for(int i=0;i<5;i++) {
        scanf("%[^n\]",str[i]);
    }
    for(int j=0;j<5;j++) {
        printf("%s\n",str[j]);
    }
    return 0;
}

我试图只使用

scanf("%s",str[i]);

然后忽略输入中的所有空格并修剪输出。我也尝试使用

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

这一次好一点,但在示例输入的任何字符之前忽略了所有空格。

    Robin Islam
// output showing
Robin Islam
// should show
    Robin Islam

我只是想让这个程序允许每个我的意思输出上的空格应该显示与输入相同而不忽略空格。有人请帮帮我。尝试了许多方法,但不知道如何使其工作或如何......请帮助

谢谢, 罗宾

2 个答案:

答案 0 :(得分:2)

scanf充满了问题,只有search for it here而且你会看到。应尽可能避免这种情况。

您正在阅读整行,并且有执行此操作的功能。 fgetsgetline。我更喜欢getline,因为它为您处理内存分配,您的输入没有超出缓冲区的风险。

#include <stdio.h>
#include <strings.h>
#include <stdlib.h>

int main() {
    char *line = NULL;
    char *lines[5];
    size_t linecap = 0;

    for( int i = 0; i < 5; i++ ) {
        /* Getline will allocate sufficient memory to line.
           It will also reuse line, so... */
        getline(&line, &linecap, stdin);

        /* ...we have to copy the line */
        lines[i] = strdup(line);
    }

    /* line must be freed after calls to getline() are finished */
    free(line);

    for( int i = 0; i < 5; i++ ) {
        printf("%s\n", lines[i]);
    }

    /* Cleaning up all memory is a good habit to get into.
       And it removes clutter from you Valgrind report. */
    for( int i = 0; i < 5; i++ ) {
        free(lines[i]);
    }

    return 0;
}

答案 1 :(得分:1)

#include<stdio.h>
#include<stdlib.h>

int main() {

    char str[5][100];
    for(int i=0;i<5;i++) {
        fgets(str[i],100,stdin);
    }
    for(int j=0;j<5;j++) {
        printf("%s\n",str[j]);
    }

    return 0;
}