Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python C:将整数读入动态分配的数组,用空格分隔,并用其他字符忽略/替换_Python_C_Translate - Fatal编程技术网

Python 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

基本上,我的问题是,我试图手动将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)] #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');
        }
}