如何强制scanf将\ n字符作为输入?

时间:2015-11-16 16:18:12

标签: c scanf

我试图在无限while循环中接受字符串输入,每次都将字符串保存在同一个数组中,但我希望在按 Enter

代码看起来像这样:

int main()
{
    char input[1000];
    while (1)
    {
        scanf("%s",input);
        if (input[0] == '\n'){ break; } //the problem is that scanf never gets the \n
        else{...}
    }
    return 0;
}

6 个答案:

答案 0 :(得分:5)

换行符\n被视为空白字符。

如果您阅读C11规范,章节§7.21.6.2,您可以看到%s格式说明符与scanf()家庭

  

s

     

匹配一系列非空白字符。

因此,使用scanf()%s进行通话时,您无法吸引(仅)\n,这确实是一个空白租船人。

您需要使用getc()来阅读换行符。

或者,您可以使用实际读取的fgets()并存储尾随换行符。

FWIW,int main()最好至少为int main(void)

答案 1 :(得分:2)

编辑: 您可以告诉scanf()接受scanf("%[a-zA-Z0-9 ]", ...);

的特定字符

答案 2 :(得分:2)

转化"%c"匹配任何字符,包括空格。如果您确实需要使用scanf(),请使用它。

// you can put this in a loop
char ch;
if (scanf("%c", &ch) != 1) /* error */;
printf("the character read is '%c' and has value %d\n", ch, ch);

请注意,使用其他功能(getc()fgets())的解决方案更好。

答案 3 :(得分:1)

相反,请使用strcspn()阅读该行,'\n'删除潜在的尾随int main(void) { char input[1000]; while (fgets(input, sizeof input, stdin)) { input[strcspn(input, "\n")] = '\0'; if (input[0] == '\0') { break; } else { ; // ... } } return 0; }

'\n'

或者不要删掉int main(void) { char input[1000]; while (fgets(input, sizeof input, stdin)) { if (input[0] == '\n') { break; } else { ; // ... } } return 0; } @R Sahu

def gebVersion      = "0.12.2"
def seleniumVersion = "2.48.2" //2.45.0
def cucumberVersion = "1.2.0"

repositories {
    ... (snippet)

    mavenRepo "http://oss.sonatype.org/content/repositories/snapshots" //Geb snapshot
}

dependencies {
     test "org.grails:grails-datastore-test-support:1.0.2-grails-2.4"

    // Geb / Spock  // http://www.gebish.org/manual/current/#grails
    test "org.gebish:geb-spock:$gebVersion"
    test "org.seleniumhq.selenium:selenium-support:$seleniumVersion"
    test "org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion"
    test "org.seleniumhq.selenium:selenium-ie-driver:$seleniumVersion"
    test "org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion"
    test "org.seleniumhq.selenium:selenium-remote-driver:$seleniumVersion" //Needed by phantomjsdriver
    test "org.spockframework:spock-grails-support:0.7-groovy-2.0"
    test("com.codeborne:phantomjsdriver:1.2.1") {
        transitive = false // phantomjs driver pulls in a different selenium version
    }
}

plugins {
    test ":geb:$gebVersion"
    test ":cucumber:$cucumberVersion 
}

答案 4 :(得分:0)

改为使用fgets(input, 1000, stdin)

然后使用size_t s = strlen(input);,如果返回的长度足够,请查看input[s - 1]哪个是换行符,您可以使用input[s - 1] == '\n'进行测试。

答案 5 :(得分:0)

使用scanf

而不是fgets
while (1)
{
    if ( fgets(input, sizeof(input), stdin) == NULL )
    {
       // Error reading. Perhaps EOF is reached.
       break; //???
    }

    if (input[0] == '\n'){ break; }
    else{...}
}