質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

632閲覧

配列pに配列aの末尾1文字だけを代入したい

tsurugiyaru

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/11/23 12:45

配列pに、配列aの最後の1文字だけを代入したいです。
最終的に「キーボードから文字列の入力を受け取り、末尾のピリオドの有無を判別し、有ればそのままを、無ければピリオドを追加して表示するプログラム」を作成したいと考えています。
その際、文字列aの末尾が代入された文字列pと、ピリオドのみが格納された文字列bを
strcmpを使い文字列同士を比較したいと考えております。

そのため、配列pに配列aの末尾1文字を代入したいと考えています。

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 int n; 7 char a[80], p[1]; 8 gets(a); 9 n = strlen(a); 10 p[0] = a[n - 1]; 11 12 printf("%s\n", p); 13 14 return 0; 15}

このようにコードを記入したところ
以下のように、aの末尾1文字と、文字列aが合体されて出力されてしまいました。

入力:iiio → 出力:oiiio 入力:aaiio → 出力:oaaiio

なぜこのようになってしまうかと、末尾1文字だけを代入するにはどうすればいいのかが知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

pがnull終端していないからです。
次のように、少なくとも長さ2で宣言・初期化してやりましょう。

C

1char p[2] = {0};

なぜこのようになってしまうか

null文字が無いので、printfがどこまで表示して良いのか判断が付いていないため。
aと連続して表示されるのはたまたまです。

末尾1文字だけを代入するにはどうすればいいのか

代入自体はできていますが、確認方法を誤っています。

そもそも文字配列ではなくただの文字型(char p)で良いのではとも思います。
比較も p == '.' で可能ですし。

投稿2021/11/23 12:49

編集2021/11/23 12:55
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsurugiyaru

2021/11/23 13:12

非常にわかりやすく、また、簡潔な方法も教えていただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問