Python C:将整数读入动态分配的数组,用空格分隔,并用其他字符忽略/替换
基本上,我的问题是,我试图手动将Python3可以轻松完成的东西翻译成C程序。我的第一个障碍是输入理解。以下是示例输入:Python C:将整数读入动态分配的数组,用空格分隔,并用其他字符忽略/替换,python,c,translate,Python,C,Translate,基本上,我的问题是,我试图手动将Python3可以轻松完成的东西翻译成C程序。我的第一个障碍是输入理解。以下是示例输入: 5 12 34 10 22 20 55 123 30 x 99 我们可以看到,这个输入中有数字、空格和字符。我用Python很容易地处理它,如下所示: n = int(input()) #first line is always a single integer matrix = [[' ' for i in range(n)] for j in range(n)] #de
5
12
34 10
22 20 55
123 30 x 99
我们可以看到,这个输入中有数字、空格和字符。我用Python很容易地处理它,如下所示:
n = int(input()) #first line is always a single integer
matrix = [[' ' for i in range(n)] for j in range(n)] #declaring matrix of just space chars
for i in range(1,n):
line = input().split(' ') #gets rid of all spaces
for j in range(len(line)):
try:
matrix[i][j] = int(line[j])
matrix[j][i] = int(line[j]) #mirrors same value on opposite part of the matrix
except:
matrix[i][j] = 'x'
matrix[j][i] = 'x'
这将产生以下矩阵:
[[' ', 12, 34, 22, 123]
[12, ' ', 10, 20, 30]
[34, 10, ' ', 55, 'x']
[22, 20, 55, ' ', 99]
[123, 30, 'x', 99, ' ']]
基本上,我想弄清楚如何在C语言中实现这一点。我看过关于如何动态读取输入、如何接收空间分隔的整数以及如何malloc integer space的文章,但我不知道如何将所有这些东西放在一起。我真的很感谢你的帮助。理想情况下,我希望将所有这些整数存储到二维整数数组中,如上图所示
编辑:这是我得到的(从其他人的有用答案中删除的代码):
^从上面看,第一个“5”是我的输入,第二个“5”是输出,第一个“12”是我的输入,第二个是输出,依此类推。代码在最后一行中断。我知道每次,它都会转储存储在“缓冲区”(即int*矩阵)中的所有内容。我不知道如何处理像“x”这样的其他字符。理想情况下,我希望将矩阵中的“x”替换为-1或其他东西。我认为将scanf与getchar混合使用确实是一个错误,但我认为避免scanf的正确方法是将
n
作为参数传递(例如,从argv[1]而不是从输入流读取它)。此外,python实际上不是一个矩阵,而是一个列表列表,在C实现中使用列表列表可能会更简洁。但是这里有一种使用大型数组的方法
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
struct entry {
enum { unknown, number, character } type;
union {
int v;
char x;
} value;
};
static int
die(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fputc('\n', stderr);
exit(EXIT_FAILURE);
}
int
main(void) {
int n, c = '\n', p = EOF, row = 0;
if( scanf("%d", &n) != 1 || n < 1 ) {
die("Invalid input in row %d (%c)", row, c);
}
struct entry *matrix = calloc(n * n, sizeof *matrix);
struct entry *t = matrix - 1, *e = matrix + n * n;
while( (c = getchar()) != EOF) {
if( isdigit(c) ) {
if( t->type == character ) {
die("Invalid input in row %d (%c)", row, c);
}
t->type = number;
t->value.v = t->value.v * 10 + c - '0';
} else if( isspace(c) && c != p ) {
t += 1;
if( t >= e ) {
die("Invalid input in row %d (%c)", row, c);
}
if( c == '\n' ) {
t->type = character;
t->value.x = ' ';
t = matrix + n * ++row;
}
} else {
if( t->type != unknown ) {
die("Invalid input in row %d (%c)", row, c);
}
t->type = character;
t->value.x = c;
}
p = c;
}
/* Display the matrix */
for( int i = 0; i < n; i++ ) {
for( int j = 0; j < n; j++ ) {
t = matrix + (( j > i ) ? (n * j + i) : (n * i + j));
switch( t->type ) {
case number:
printf("%8d", t->value.v);
break;
case unknown:
printf("%8s", "??");
break;
case character:
printf(" '%c'", t->value.x);
}
}
putchar('\n');
}
}
#包括
#包括
#包括
#包括
结构项{
枚举{未知,数字,字符}类型;
联合{
INTV;
字符x;
}价值观;
};
静态整数
模具(常量字符*fmt,…)
{
va_列表ap;
va_启动(ap、fmt);
vfprintf(标准、fmt、ap);
va_端(ap);
fputc('\n',stderr);
退出(退出失败);
}
int
主要(无效){
int n,c='\n',p=EOF,row=0;
如果(scanf(“%d”,&n)!=1 | | n<1){
die(“第%d行(%c)中的无效输入”,第,c行);
}
struct entry*matrix=calloc(n*n,sizeof*matrix);
结构项*t=矩阵-1,*e=矩阵+n*n;
而((c=getchar())!=EOF){
if(isdigit(c)){
如果(t->type==字符){
die(“第%d行(%c)中的无效输入”,第,c行);
}
t->type=number;
t->value.v=t->value.v*10+c-'0';
}else如果(isspace(c)&&c!=p){
t+=1;
如果(t>=e){
die(“第%d行(%c)中的无效输入”,第,c行);
}
如果(c=='\n'){
t->type=字符;
t->value.x='';
t=矩阵+n*++行;
}
}否则{
如果(t->type!=未知){
die(“第%d行(%c)中的无效输入”,第,c行);
}
t->type=字符;
t->value.x=c;
}
p=c;
}
/*显示矩阵*/
对于(int i=0;ii)?(n*j+i):(n*i+j));
开关(t
5
5
12
12
34 10
12 34 10
22 20 55
12 34 10 22 20 55
123 30 x 99
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
struct entry {
enum { unknown, number, character } type;
union {
int v;
char x;
} value;
};
static int
die(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fputc('\n', stderr);
exit(EXIT_FAILURE);
}
int
main(void) {
int n, c = '\n', p = EOF, row = 0;
if( scanf("%d", &n) != 1 || n < 1 ) {
die("Invalid input in row %d (%c)", row, c);
}
struct entry *matrix = calloc(n * n, sizeof *matrix);
struct entry *t = matrix - 1, *e = matrix + n * n;
while( (c = getchar()) != EOF) {
if( isdigit(c) ) {
if( t->type == character ) {
die("Invalid input in row %d (%c)", row, c);
}
t->type = number;
t->value.v = t->value.v * 10 + c - '0';
} else if( isspace(c) && c != p ) {
t += 1;
if( t >= e ) {
die("Invalid input in row %d (%c)", row, c);
}
if( c == '\n' ) {
t->type = character;
t->value.x = ' ';
t = matrix + n * ++row;
}
} else {
if( t->type != unknown ) {
die("Invalid input in row %d (%c)", row, c);
}
t->type = character;
t->value.x = c;
}
p = c;
}
/* Display the matrix */
for( int i = 0; i < n; i++ ) {
for( int j = 0; j < n; j++ ) {
t = matrix + (( j > i ) ? (n * j + i) : (n * i + j));
switch( t->type ) {
case number:
printf("%8d", t->value.v);
break;
case unknown:
printf("%8s", "??");
break;
case character:
printf(" '%c'", t->value.x);
}
}
putchar('\n');
}
}