0

私はこのコードを持っています:

#include <stdio.h>

int main(void) {
    char p[5][5];
    int i,j;

    for(i=1;i<=1;i++){
        for(j=1;j<=2;j++) {
            printf("\nInput Product code %d of day %d: ", j,i);
            scanf("%s", &p[i][j]);
        }
    }

    for(i=1;i<=1;i++){
        for(j=1;j<=2;j++) {
            printf("\n\tProduct code %s day %d", &p[i][j],i);
        }
    }

}

このコードは次を出力します。

Input Product code 1 of day 1: hello

Input Product code 2 of day 1: hi

  Product code hhi day 1

Product code hi day 1

hello と hi が最初に hello を出力する代わりに相互接続している理由を知っている人はいますか?

私は文字列について多くのことを研究してきましたが、これよりうまく機能するものはないようです。

4

3 に答える 3

2

p[][]文字列の double 配列ではなく、char の double 配列です。次のように 5 つの行と 5 つの列があります。

p[row][column] = 

 Row| Column ->         |
  v | 0 | 1 | 2 | 3 | 4 |
| 0 |   |   |   |   |   |
| 1 |   |   |   |   |   |
| 2 |   |   |   |   |   |
| 3 |   |   |   |   |   |
| 4 |   |   |   |   |   |

1 つ目scanf()は、i = 1、j = 1 のときに呼び出され、文字列 "hello" をp[][]次のようにコピーします (「\0」は文字列を終了する NUL 文字です)。

    | 0 | 1 | 2 | 3 | 4 |
| 0 |   |   |   |   |   |
| 1 |   | H | e | l | l |
| 2 | o |\0 |   |   |   |
| 3 |   |   |   |   |   |
| 4 |   |   |   |   |   |

次に呼び出されるときは、i = 1、j = 2 です。

    | 0 | 1 | 2 | 3 | 4 |
| 0 |   |   |   |   |   |
| 1 |   | H | h | i |\0 |
| 2 | o |\0 |   |   |   |
| 3 |   |   |   |   |   |
| 4 |   |   |   |   |   |

これを書く1つの方法:

#include <stdio.h>
#define MAX_CODE_LEN   80 /* or something */

int main(void) 
{
    char *code[5][5] = {0},
         currentCode[MAX_CODE_LEN] = {0};
    int day = 0,
        codeNum = 0;

    /* start loops at 0 */
    for ( day = 0; day < 5; day++ ) {

        for ( codeNum = 0; codeNum < 5; codeNum++ ) {
            int len = 0;

            printf("\nInput Product code %d of day %d: ", codeNum, day);
            scanf("%s", currentCode);

            /* len doesn't include NUL but malloc needs it */
            len = strlen(currentCode);

            /* yoda style so compiler catches assignment instead of equality */
            if ( 0 == len ) {
                /* if the user didn't enter a code move onto the next day */
                code[day][codeNum] = NULL;
                break;
            }
            len = len >= MAX_CODE_LEN? MAX_CODE_LEN - 1: len;
            code[day][codeNum] = malloc(len * sizeof(char) + 1);
            strcpy(code[day][codeNum], currentCode);
        }
    }

    for ( day = 0; day < 5; day++ ) {

        for ( codeNum = 0; codeNum < 5; codeNum++ ) {

            if ( NULL == code[day][codeNum] ) {
                /* no more codes for today */
                break;
            }
            printf("\n\tProduct code %s day %d", code[day][codeNum], day);
        }
    }

    return 0;
}
于 2013-05-14T16:40:34.333 に答える
0
char p[5][5];

これは文字列の行列であり、文字列の行列ではありません

を使用してscanf()、マトリックスの各要素に文字列を配置します。そして、これは不可能です。

次の定義のいずれかを使用する必要があります。

1)

char p[5][5][MAX_SIZE_OF_INPUT_STRINGS];

そしてscanfは

scanf("%s", p[i][j]);

2)

char *p[5][5];

そしてscanfは

scanf("%ms", p[i][j]);

p[i][j]here によって動的に割り当てられたメモリが指されており、プログラムで使用できなくなったときscanf()に解放する必要がありますfree(p[i][j])p[i][j]

于 2013-05-14T15:54:41.223 に答える
0

その理由は、文字列が char の単なる配列であるためです (\0またはで終了しnullます。現在、文字のインデックスを作成scanfしていて、渡した char 参照を取得し、構造体の残りの部分をそれで埋めているだけです。ストリング。

あなたがしていることは、pをに設定することです

* * * * *
* h e l l
o\0 * * *
* * * * *
* * * * *

その後

* * * * *
* h h i\0
o\0 * * *
* * * * *
* * * * *

私があなただったら、このようなものの近くに住むでしょう

char p[5][6];
int i,j;


for(i=0;i<2;i++)
{

    printf("\nInput Product code of day %d: ", i);
    scanf("%s", &p[i]);
}

for(i=0;i<2;i++)
{
    printf("%s\n", &p[i]);
}
于 2013-05-14T15:55:43.273 に答える