我试图在无限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;
}
答案 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{...}
}