

以下のプログラムを実行したところ、二つの配列を入力したいのですが、二つ目の配列が入力できず、そのままif文が実行されてしまいます。  
どこか足りていないのでしょうか？  
教えてください。よろしくお願いします。

[code]

    #include <stdio.h>
    #include <string.h>
    
    #define N 128
    int main( void )
    {
        char str_input[ N ];
        char str_new[ N ];
        
        printf( "Key in a letter>> ");
        str_input[ N ] = getchar();
        printf( "%d\n", strlen( str_input ) );
        
        printf( "Key in a letter>> ");
        str_new[ N ] = getchar();
        
        if ( strcmp( str_input, str_new ) == 0 )
        {
            printf( "文字列 str_input と str_new は一致しています\n" );
        }
        else
        {
            printf( "文字列 str_input と str_new は一致していません\n" );
        }
        
        strcpy( str_input, str_new );
        
        if( strcmp( str_input, str_new ) == 0 )
        {
            printf( "文字列 str_input と str_new は一致しています\n" );
        }
        else
        {
            printf( "文字列 str_input と str_new は一致していません\n" );
        }
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-11-28T17:50:20.677
72259
2020-11-29T02:54:55.087
2020-11-28T22:35:54.357
7347
42820
question
c
入力ができません。


質問された方のコードは、配列の有効範囲を超えて代入しています。

[code]

     #define N 128
     int main( void )
     {
         char str_input[ N ];
    
[/code]

char str_input[ N ];は要素数が128個のchar型の配列を宣言していますが、

[code]

         str_input[ N ] = getchar();
    
[/code]

この文ではgetchar()で標準入力から読み込んだ1文字をstr_input[N]つまりstr_input[128]に代入しています。  
C言語の配列の添え字は0から始まりますので、129番目の要素に代入していることになります。  
これは配列の範囲外に代入しているのでバグです。

str_newも同じ問題があります。

* * *
[code]

        if ( strcmp( str_input, str_new ) == 0 )
        {
            printf( "文字列 str_input と str_new は一致しています\n" );
    
[/code]

このコードをみるとstr_inputとstr_newを文字列比較していますので、str_inputには文字列を入力したいのだと思います。  
今のコードは入力した1文字をstr_inputに格納しているだけなので、「文字列」を入力するように変更するか、1文字入力を繰り返す必要があると思います。


CC BY-SA 4.0
2020-11-29T01:00:33.423
72260
2020-11-29T01:00:33.423
35558
72259
answer


繰り返しになりますが、前々回 [Segmentation
fault(コアダンプ)の原因が分からない](https://ja.stackoverflow.com/questions/72118/) と前回
[Segmentation
fault(コアダンプ)の原因が分かりません](https://ja.stackoverflow.com/questions/72128/)
の質問に対する回答で紹介されている [cppcheck](https://sourceforge.net/p/cppcheck/wiki/Home/)
でチェックしてみると、これまでの質問と同様の原因(`arrayIndexOutOfBounds`)によるエラーである事が判ります。

[code]

    $ cppcheck -v --enable=all input_string.c
    Checking input_string.c ...
    Defines:
    Undefines:
    Includes:
    Platform:Native
    input_string.c:11:12: error: Array 'str_input[128]' accessed at index 128, which is out of bounds. [arrayIndexOutOfBounds]
      str_input[ N ] = getchar();
               ^
    input_string.c:15:10: error: Array 'str_new[128]' accessed at index 128, which is out of bounds. [arrayIndexOutOfBounds]
      str_new[ N ] = getchar();
             ^
    input_string.c:12:3: portability: %d in format string (no. 1) requires 'int' but the argument type is 'size_t {aka unsigned long}'. [invalidPrintfArgType_sint]
      printf( "%d\n", strlen( str_input ) );
      ^
    
[/code]

最後の `invalidPrintfArgType_sint` ですが、`printf(3)` に説明があります。

**printf(3)**

> **Length modifier**  
>  Here, "integer conversion" stands for d, i, o, u, x, or X conversion.
>
> **z** A following integer conversion corresponds to a size_t or ssize_t
> argument, or a following n conversion corresponds to a pointer to a size_t
> argument.

この場合、文字列の長さなので `unsigned int` を指定します(`%zu`)。

[code]

      printf("%zu\n", strlen(str_input));
    
[/code]

その他、入力の読み込みに `getchar()` が使用されていますが、1文字(1
byte)しか読み込みませんので、2文字以上の文字列を読み込みたいのであれば `fgets(3)` などを利用する方が良いかと思います。

**fgetc(3)**

> **NAME**  
>  fgetc, fgets, getc, getchar, ungetc - input of characters and strings
>
> **DESCRIPTION**  
>  **fgetc()** reads the next character from stream and returns it as an
> unsigned char cast to an int, or EOF on end of file or error.
>
> **getc()** is equivalent to fgetc() except that it may be implemented as a
> macro which evaluates stream more than once.
>
> **getchar()** is equivalent to getc(stdin).
>
> **fgets()** reads in at most one less than size characters from stream and
> stores them into the buffer pointed to by s. Reading stops after an EOF or a
> newline. **If a newline is read, it is stored into the buffer**. **A
> terminating null byte('\0') is stored after the last character in the
> buffer**.


CC BY-SA 4.0
2020-11-29T02:54:55.087
72263
2020-11-29T02:54:55.087
72259
answer