2016-12-04 3 views
2

文字列の行列を持っています。これを初期化し、その値をユーザー入力である値に変更します。私の知る限り、この値をTe行列(コードの最後の行)に追加しようとすると、私のコードはすべてOKです。ここにある:あなたがinserir()を機能させるmatriz[MAX_LINHAS][MAX_COLUNAS]を渡すことはできませんCの2次元配列(行列)内の文字列を変更する

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 

#define MAX_LINHAS 20 
#define MAX_COLUNAS 10 

void iniciarMatriz(char matriz[MAX_LINHAS][MAX_COLUNAS]); 
void mostraMatriz(char matriz[MAX_LINHAS][MAX_COLUNAS]); 
void inserir(char matriz[MAX_LINHAS][MAX_COLUNAS]); 

void main(void) { 
    char matriz[MAX_LINHAS][MAX_COLUNAS]; 

    iniciarMatriz(matriz); 
    //mostraMatriz(matriz); 

    inserir(matriz[MAX_LINHAS][MAX_COLUNAS]); 
    mostraMatriz(matriz); 
} 

void iniciarMatriz(char matriz[MAX_LINHAS][MAX_COLUNAS]) { 
    int i;//linhas 
    int j;//colunas 

    for (i = 0; i < MAX_LINHAS; i++) { 
     for (j = 0; j < MAX_COLUNAS; j++) { 
      matriz[i][j] = 0; 
     } 
    } 
} 

void mostraMatriz(char matriz[MAX_LINHAS][MAX_COLUNAS]) { 
    int i; 
    int j; 

    for (i = 0; i < MAX_LINHAS; i++) { //linhas 
     for (j = 0; j < MAX_COLUNAS; j++) { //colunas 
      printf("%i \t", matriz[i][j]); 
     } 
     printf("\n"); 
    } 
} 

void inserir(char matriz[MAX_LINHAS][MAX_COLUNAS]) { 
    char nome[10]; 
    int linha; 
    int coluna; 

    printf("Insira a string: \n"); 
    scanf("%s", nome); 

    printf("Em que linha ?\n"); 
    scanf("%i", &linha); 

    printf("Em que coluna ?\n"); 
    scanf("%i", &coluna); 

    matriz[linha][coluna] = nome; 
} 
+2

文字マトリックスです!行列セルに文字列全体を挿入することはできません。そして、サンプルの入力と予想される出力を投稿して、問題の理解を深めてください。 –

+0

どうすればいいですか?入力は10文字以下の文字列になります。私はコードの最後の行のおかげでプログラムがクラッシュするので、出力を得ることはできません。 –

+0

サンプル入力と予想される出力を投稿してください。問題がどこにあるのか把握し、それに応じてコードを修正しようとします。 –

答えて

3

:あなたは行列の限界を超えた要素に言及している

  • inserir()には、en要素の値ではなく、行列へのポインタが必要です。単に書く:機能inserir()inserir(matriz);

を、あなたはmatriz[linha][coluna] = nome;との完全な文字列を使用して、2D char配列の要素を初期化することはできません、あなたが代わりに限界をテストした後に文字列をコピーする必要があります

void inserir(char matriz[MAX_LINHAS][MAX_COLUNAS]) { 
    char nome[10]; 
    int linha; 
    int coluna; 

    printf("Insira a string: \n"); 
    scanf("%s", nome); 

    printf("Em que linha ?\n"); 
    scanf("%i", &linha); 

    printf("Em que coluna ?\n"); 
    scanf("%i", &coluna); 

    if (linha < MAX_LINHAS) { 
     for (int i = 0; nome[i] != '\0' && coluna < MAX_COLUNAS - 1; i++) { 
      matriz[linha][coluna] = nome[i]; 
      coluna++; 
     } 
     if (coluna < MAX_COLUNA) { 
      matriz[linha][coluna] = '\0'; 
     } 
    } 
} 

matrizは、charの2D配列です。文字または小さな整数値を格納するために使用できます。文字は小さな整数値です。 Cは静的な型指定を使用しています。他の言語とは異なり、数字と文字列を配列に入れ替えることはできません。現在配列を数値として出力していますが、文字列を一連の行列セルに格納すると、出力の文字値はmostraMatrizになります。

+0

ありがとう、それは働いた!しかし、今、私は "文字列"を挿入し、私が選択した徴候に "Int"を取得します。 –

+0

ホーええ、prinftの整数で私の悪いです。どうもありがとう ! –

2

(あなたが受け入れる文字の数を制限する必要があります(正しい)他の回答に加えて、あなたもinserirnomeで済ますことができますし、単にmatrizに直接文字列を読み取るためにmatriz[lihna]へのポインタを提供し、これは他の回答のループによって行われるか、フィールド幅指定子scanfフォーマット文字列内で実行できます。

MAX_LINHASMAX_COLUNASの変更にも対応できるため、ループでは最も洗練された解決策が得られます。ただし、フィールド幅の指定子を変更する必要はありません。しかし、両方の仕組みと利点と欠点も理解する必要があります。以下の変更を考慮してください。 inserir

void mostraMatriz(char matriz[MAX_LINHAS][MAX_COLUNAS]) { 
    int i; 
    int j; 

    for (i = 0; i < MAX_LINHAS; i++) { //linhas 
     if (*(matriz[i])) { 
      printf ("matriz[%2d] : ", i); 
      for (j = 0; j < MAX_COLUNAS && matriz[i][j]; j++) { //colunas 
       printf("%i \t", matriz[i][j]); 
      } 
      printf("\n"); 
     } 
    } 
} 

最後に、例:

char matriz[MAX_LINHAS][MAX_COLUNAS] = {{0}}; 

あなたはコンテンツのみを持っているマトリズ内linhas上で動作するようmostraMatrizを制限することができます:あなたは完全に宣言時にmatrizを初期化することができ

適切なフィールド幅の制限でmatrizに直接読み取り:

void inserir (char matriz[MAX_LINHAS][MAX_COLUNAS]) { 
    int linha; 

    printf ("Em que linha ?\n"); /* validate linha */ 
    if (scanf ("%i", &linha) != 1 || linha >= MAX_LINHAS) 
     return; 

    printf ("Insira a string: \n"); 
    scanf ("%9s", matriz[linha]); 
} 

注:入力バッファから末尾の改行の文字列と制御除去を空白に対応するために、あなたはおそらく優れているscanf ("%9[^\n]%*c", matriz[linha]);それとも、いっそ、fgets (matriz[linha], MAX_COLUNAS, stdin);を使用して提供して、改行を削除します。

inserirへの呼び出しが成功したかどうかを呼び出し関数内でチェックできるように、inserirint(または任意のフィッティング)にも変更する必要があります。

使用例

$ ./bin/matriz 
Em que linha ? 
3 
Insira a string: 
MyString 
matriz[ 3] : 77   121  83  116  114  105  110  103 

両方の答えかかわらず、考えて、あなたは、さらに質問がある場合は私に知らせてください。