这个问题来自HackerRank,我尝试使用%[^ \ n] s作为长话。但是,输出继续产生.0
如何将%[^ \ n] s替换为其他字符串以接收输入?
这是输入:
12
4.0
is the best place to learn and practice coding!
这是我的输出:
16
8.0
HackerRank .0
这是预期的输出:
16
8.0
HackerRank is the best place to learn and practice coding!
这是我的完整代码,正如您所看到的,它无法识别%[^ \ n] s。如何解决这个问题呢?谢谢。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main() {
int i = 4;
double d = 4.0;
char s[] = "HackerRank ";
// Declare second niteger, double, and String variables.
int value1, sum1, value2;
double e = 2.0, sum2;
char t[30];
// Read and save an integer, double, and String to your variables.
scanf(" %d", &value1);
scanf("%d", &value2);
scanf("%[^\n]s", t); //** POINT OF INTEREST **
// Print the sum of both integer variables on a new line.
sum1 = value1 + i;
printf("%d\n", sum1);
// Print the sum of the double variables on a new line.
sum2 = d * e;
printf("%.1lf\n", sum2);
// Concatenate and print the String variables on a new line
// The 's' variable above should be printed first.
printf("%s %s", s, t);
return 0;
}
答案 0 :(得分:1)
您scanf()
无法读取字符串的原因很可能是您在扫描完最后一个数字后仍未读取流中的换行符。 "%[^\n]"
尝试读取包含除换行符之外的任何内容的字符串,并在到达无效字符时停止;由于下一个字符是换行符,因此无法读取有效字符,并且无法分配字段。修复它所需要做的就是在扫描字符串之前读取换行符。
此外,%[
说明符最后不需要s
- 它是%s
的不同转换说明符,而不是它的修饰符。
最后,建议您指定%[
或%s
的宽度,以便长输入字符串不会溢出您读取字符串的缓冲区。宽度应该是在null之前读取的最大字符数,因此比缓冲区大小小。
使用scanf(" %29[^\n]",t)
将在扫描字符串之前读取空格(包括该换行符),然后扫描最多包含29个非换行符的字符串(对于30字符缓冲区)。
答案 1 :(得分:1)
考虑到您的输入输出示例,我修改了您的代码:
char t[256]; // the string "is the best place to learn and practice coding!" MUST FIT!!!
...
scanf("%d", &value1);
scanf("%lf", &d); // NOT %d, %lf !!! &d or &e - I don't know - depends on you
scanf("\n%[^\n]", &t);
...
printf("%s%s", s, t); // you don't need a space, since your "s" already contains it.
对我来说很好。
<强> UPD:强> 现在它确实工作正常。