2016-08-19 61 views
-2

這個問題是從HackerRank,我嘗試使用%[^ \ n] s長詞。但是,輸出繼續產生.0C程序數組超過1個字

如何將%[^ \ 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

請澄清一下您的問題。檢查[如何問](http://stackoverflow.com/help/how-to-ask)。 – Shubham

+0

如何將%[^ \ n] s替換爲其他字符串以接收輸入? –

+0

流中可能有一個換行符,從讀取的最後一個數字開始。這會導致'%[^ \ n]'失敗,因爲在下一個換行符之前沒有要讀取的字符。另外''''''''''''''''''''後面不需要''''。 – Dmitri

回答

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: 現在它實際上工作正常。

+0

@BLUEPIXY怎麼了? – KKastaneda

+0

@BLUEPIXY明白了。現在看來是對的。 – KKastaneda

+0

@BLUEPIXY你說得對,謝謝。 – KKastaneda

1

scanf()未能讀取字符串的原因是最有可能的,有一個換行符仍然流中,你掃描的最後一個數字後並沒有讀出。 "%[^\n]"嘗試讀取一個字符串,其中包含除換行符之外的任何內容,並在到達無效字符時停止;由於下一個字符是換行符,因此沒有有效的字符可讀,並且無法分配字段。在掃描字符串之前,只需讀取換行符即可修復它。

另外,%[說明符最後不需要s - 它是與%s不同的轉換說明符,而不是它的修飾符。

最後,建議您指定%[%s的寬度,以便長輸入字符串不會超出您讀入字符串的緩衝區。寬度應該是空值之前要讀取的最大字符數,因此小於緩衝區大小。

使用scanf(" %29[^\n]",t)將在掃描字符串之前讀取空白(包括該換行符),然後掃描最多包含29個非換行符(對於30個字符的緩衝區)的字符串。