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

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

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

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

Q&A

2回答

554閲覧

strcmpを使った文字列の比較について

Motit

総合スコア0

C

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

0グッド

0クリップ

投稿2022/01/23 20:07

c言語で文字列の比較を実装しようとしています.
内容は都道府県名を入力し,あらかじめ用意してあるデータ配列(一部の都道府県)と比較するプログラムです.
このとき福島県の比較だけstrcmpの動作だけ正常に比較されないのですがなぜでしょうか.

c言語

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#include<limits.h> 5#define MAX_SIZE 13 6char *graph_data[] = { 7 "Tokyo", 8 "Saitama", 9 "Gunma", 10 "Chiba", 11 "Ibaraki", 12 "Tochigi", 13 "Fukushima", 14 "Niigata", 15 "Yamagata", 16 "Miyagi", 17 "Akita", 18 "Iwate", 19 "Aomori" 20}; 21int main(){ 22 int flag; 23 int s_start; 24 int s_destination; 25 char start[10],destination[10]; 26 27 do{ 28 fgets(start,sizeof(start),stdin); 29 start[strlen(start)-1]='¥0'; //改行コードを消す 30 for(int i=0;i<MAX_SIZE;i++){ 31 if(strcmp(start,graph_data[i])==0){ 32 s_start=i; 33 flag=1; 34 break; 35 } 36 } 37 if(flag==-1)printf("The city name does not exist. Please enter the departure city again. :"); 38 }while(flag!=1); 39 printf("start %s¥n",graph_data[s_start]); 40 41} 42

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

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

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

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

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

jimbe

2022/01/23 20:42

for 文の直前で start を表示してみれば分かると思います。
guest

回答2

0

Fukushima\n という文字列をfgetsで読み込ませたとき、最初の読み込みでは、Fukushima\0 がバッファに入り、\n は読み込まれません。なぜなら、\nを読み込もうとすると、\0で文字列を終端させることができないからです。これがfgets関数の仕様です。
今回の場合では、start[11以上]であれば、バッファは足ります。が、よりきちんと、堅牢なプログラムを書くのであれば、無批判にstart[strlen(start)-1]='¥0';と書くのではなく、「文字列の長さが1以上か判定し、そうであり、かつ、文字列の最後の文字が改行コードであればそれを削除する。改行コードがなければ長すぎる文字列が入力されているので、エラーとして扱い、改行コードが現れるかEOFになるかエラーになるまで、必要なだけ文字列を空読みする」など、ありうるパターンを細かく想定すべきでしょう。

投稿2022/01/23 23:27

編集2022/01/24 09:18
majiponi

総合スコア1720

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

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

jimbe

2022/01/24 04:05

> \nで文字列を終端させることができないから \0 ではないでしょうか。
majiponi

2022/01/24 09:17

その通りです。修正します。
guest

0

char start[10]

このサイズが小さすぎます

C言語のコードを組むなら、デバッグ環境を揃えましょう
コードの任意の場所で実行を止めて、変数のナカミを見ることができます
また、1行づつ実行させて、動作を確認できます

Windowsなら、VisualStudio入れてみませんか

投稿2022/01/23 23:12

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問