[英]How to print two strings on the same line in c
我想輸入一個帶空格的字符串,並在同一行上打印另一個字符串。
int i = 4;
double d = 4.0;
char s[] = "Apple ";
int x;
double y;
char z[105];
scanf("%d",&x);
scanf("%lf",&y);
scanf("%[^105\n]s",z);
printf("%d\n",i+x);
printf("%0.1lf\n",d+y);
printf("%s %s",s,z);
return 0;
scanf
格式說明符 "%[^105]s"
使用一個字符類 [...]
,它本身就是一個獨立的說明符,最后不需要's'
。 通過在末尾放置's'
,您強制scanf
在無限數量的字符之后查找文字's'
,不包括1, 0, 5
。
您似乎打算使用該數字來保護您的數組邊界 - 這是一件好事,但在這種情況下正確的格式是"%104[^\\n]"
,它將讀取多達104
不包含a的字符'\\n'
(保留空字符的空間)。
例如:
if (scanf("%104[^\n]",z) == 1)
printf("%s %s\n",s,z);
( 注意:始終通過至少檢查返回來驗證所有用戶輸入)
另請注意:通過NOT讀取上面的'\\n'
,它會在您的輸入緩沖區( stdin
)中保留未讀狀態,如果您的下一次嘗試輸入是"%c"
或"%[...]"
,您將獲取'\\n'
作為輸入的一部分,因為nether "%c"
或“%[...]”消耗了前導空格。
將它放在一個示例中,您可以這樣做:
#include <stdio.h>
int main (void) {
char s[] = "Apple";
char z[105];
printf ("enter z: ");
if (scanf("%104[^\n]",z) == 1)
printf("%s %s\n",s,z);
else
fputs ("error: stream error or user canceled.\n", stderr);
return 0;
}
( 注意:建議使用fgets()
而不是scanf
來讀取行,然后只需修剪填充緩沖區中包含的'\\n'
)
示例使用/輸出
$ ./bin/oneline
enter z: is a fruit
Apple is a fruit
使用fgets()
代替
不使用scanf
作為行輸入,而是使用面向行的輸入函數,如fgets()
,這將消耗整行(包括行結尾)。 確保您的輸入緩沖區保持一致狀態,不依賴於先前的格式說明符用戶,例如
...
#include <string.h>
...
printf ("enter z: ");
if (fgets (z, sizeof z, stdin) != NULL) {
z[strcspn (z, "\n")] = 0; /* trim '\n' from end of z */
printf("%s %s\n",s,z);
}
在評論中編輯每個問題
您的新代碼出現問題是 scanf("%lf",&y);
將stdin
的'\\n'
留下未讀 ,然后嘗試讀取scanf("%[^105\\n]",z);
因為你已經排除了在倒置字符類中讀取'\\n'
而沒有讀取任何內容,然后你將stdin
作為輸入讀取,其中第一個字符是'\\n'
。 "%[^105\\n]"
是指:讀取的字符的數量不受限制,並僅當一個停止讀出的1, 0, 5
或'\\n'
字符(或EOF
遇到)。
由於stdin
剩下的內容,以及如何處理前導空格取決於所使用的格式說明 符 ,因此使用scanf
混合輸入充滿了新C程序員的陷阱 。 這就是建議用戶輸入fgets()
(或POSIX getline()
),然后使用sscanf
從填充緩沖區解析所需信息的原因。 使用面向行的輸入函數,在每個輸入上完全消耗該行(給定足夠的緩沖區大小 - 不要吝嗇),消除了scanf
的問題。
要使當前代碼正常工作,您可以:
#include <stdio.h>
/* simple function to empty remainder of line in stdin */
void empty_stdin (void)
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
int main (void) {
int i = 4, x;
double d = 4.0, y;
char s[] = "Apple ", z[105];
scanf("%d",&x);
scanf("%lf",&y); /* leaves '\n' as next char in stdin */
empty_stdin(); /* empty extraneous characters */
scanf("%104[^\n]",z); /* read up to 104 chars, \n, or EOF */
printf("%d\n",i+x);
printf("%0.1lf\n",d+y);
printf("%s %s\n",s,z);
return 0;
}
( 驗證每次調用scanf
- 留給你)
如果您有其他問題,請與我們聯系。
我在scanf中使用\\ n解決了這個問題( “%lf \\ n ”,&y);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.