我正在尝试将一些int
保存到从用户输入中读取的数组中。我不知道每一行int
的数量,只知道该行的最大数量int
的行数。例如,如果这是5,则用户应输入5行int
,每行最多5个元素。价值观将是积极的。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int n;
scanf("%d",&n);
int array_row[n];
int i=0;
int noEnter=n;
//My idea is when in getchar() there is a enter it means that the user wants to go to the next line so decrement noEnter with 1 and also store a value -1 which tells me that that was the end of the line
while(noEnter!=0){
int c;
if(scanf("%d",&c)==1){
array_row[i]=c;
i++;
continue;
}
char d=getchar();
if(d=='\n'){
array_row[i]=-1;
i++;
noEnter--;
continue;
}
}
for(int i=0;i<n*n;i++){
printf("%d ",array_row[i]);
}
return 0;
}
输入示例:
5
4
4 35 65
4 32
2 222 4 5 6
4
输出:
4 -1 4 35 65 -1 4 32 -1 2 222 4 5 6 -1 4 -1
答案 0 :(得分:2)
scanf
不会像您期望的那样停留在\n
。它正在读取整数...结果我猜你的程序甚至没有结束。读一行并将其分成整数。这样你就可以获得整数并相应地处理它们。
由于输入的整数数目未知,您可以对行strtok
进行标记,然后将每个数字从字符串转换为int
。
此外,您的输入不符合给定的输出。你已经在第一行给出了输入5,但它从未出现在前几个数字的输出中。
#define LINE 100
..
int len=0;
char line[LINE];
char*word;
while(noEnter<5){
fgets(line,LINE,stdin);
word=strtok(line," \n");
if(word == NULL)
break;
while(word != NULL){
int p=atoi(word);
array_row[len++]=p;
word=strtok(NULL," \n");
}
noEnter++;
array_row[len++]=-1;
}
scanf
由执行
读取输入到第一个非空白字符(仍然是
未读),或直到不再能读取任何字符。
此处,您甚至无法在\n
之前使用getchar()
消费\n
scanf()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE 50
int main(int argc, char *argv[]) {
int n=5;
int array_row[LINE];
int len=0;
int noEnter=3;
char line[LINE];
char*word;
while(noEnter<5){
fgets(line,LINE,stdin);
word=strtok(line," \n");
if(word == NULL)
break;
while(word != NULL){
int p=atoi(word);
array_row[len++]=p;
word=strtok(NULL," \n");
}
noEnter++;
array_row[len++]=-1;
}
for(int i=0;i<len;i++){
printf("%d ",array_row[i]);
}
return 0;
}
消耗并丢弃{{1}}。
{{1}}
答案 1 :(得分:0)
scanf的一个主要问题是它对于读取换行符位置(与其他空格相对)很重要的数据没有用。 Scanf只会破坏空格上的内容,空格,制表符和换行符之间没有区别,所以5行数和5行数之间没有区别。
因此,如果您关心换行符,通常需要使用fgets
将行读入缓冲区,然后使用sscanf
来解析该行中的数字。