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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

4回答

1848閲覧

C言語ポインタ書籍の勉強でエラーを解決したい。

yochan0913

総合スコア12

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

1クリップ

投稿2022/02/27 02:27

編集2022/02/27 12:48

前提・実現したいこと

C言語ポインタ書籍の勉強中にコードを写したところ、エラーが発生しましたが解決の方法がよく分かりません。
型にバイトサイズが越えてるよ。っていうエラーメッセージは読めるのですがアドバイスをお願いします。C言語は初めてでvscodeでコードランナーを使ってコンパイルしています。

発生している問題・エラーメッセージ

hello.c:48:34: error: character too large for enclosing character literal type if( (p = strrchr(command,'¥n')) != NULL){ ^ hello.c:48:34: warning: multi-character character constant [-Wmultichar] hello.c:49:18: error: character too large for enclosing character literal type *p = '¥0'; ^ hello.c:49:18: warning: multi-character character constant [-Wmultichar] 2 warnings and 2 errors generated.

該当のソースコード

C言語 書籍:ポインタが理解できない理由

1 2ソースコード 3 4 5#include <stdio.h> 6#include <string.h> 7#include <stdlib.h> 8 9int list(void){ 10 printf("func list¥n"); 11 return 1; 12}; 13 14int show(void){ 15 printf("func show¥n"); 16 return 1; 17}; 18 19int quit(void){ 20 exit(0); 21}; 22 23struct command{ 24 char *com_str; 25 int (*com_func)(void); 26}; 27 28struct command coms[] = { 29 {"ls",list},{"dir",list}, 30 {"cat",show},{"type",show}, 31 {"quit",quit},{"exit",quit}, 32 {NULL,NULL} 33}; 34 35int do_command(char *command){ 36 struct command *p; 37 for(p = coms; p->com_str != NULL; p++){ 38 if( strcmp(p->com_str,command)==0){ 39 return p->com_func(); 40 } 41 } 42 printf("command not found¥n"); 43 return 0; 44} 45 46int main(void){ 47 char command[80]; 48 char *p; 49 while(1){ 50 printf(">"); 51 fgets(command,80,stdin); 52 if( (p = strrchr(command,'¥n')) != NULL){ 53 *p = '¥0'; 54 }do_command(command); 55 }return 0; 56} 57

試したこと

一部をコメントアウトして試してみましたが、更にエラーが増えました。
hello.c:15:5: note: include the header <stdlib.h> or explicitly provide a declaration for 'exit'
と出たので#includeを追記しました。

補足情報(FW/ツールのバージョンなど)

vscode 拡張機能 c/c++ code runner Macです。 環境抜かりすみません。

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

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

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

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

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

jimbe

2022/02/27 04:44

「発生している問題・エラーメッセージ」にご提示されているエラーメッセージをコードのマークダウンで囲って頂けますか。 エラー個所を示す「^」の位置がどこなのかが分かりません。
guest

回答4

0

以下のコードの右上にあるコピーアイコンをクリックして、自分の環境にペーストしてコンパイルしてみてください。

c

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5int list(void){ 6 printf("func list¥n"); 7 return 1; 8}; 9 10int show(void){ 11 printf("func show¥n"); 12 return 1; 13}; 14 15int quit(void){ 16 exit(0); 17}; 18 19struct command{ 20 char *com_str; 21 int (*com_func)(void); 22}; 23 24struct command coms[] = { 25 {"ls",list},{"dir",list}, 26 {"cat",show},{"type",show}, 27 {"quit",quit},{"exit",quit}, 28 {NULL,NULL} 29}; 30 31int do_command(char *command){ 32 struct command *p; 33 for(p = coms; p->com_str != NULL; p++){ 34 if( strcmp(p->com_str,command)==0){ 35 return p->com_func(); 36 } 37 } 38 printf("command not found¥n"); 39 return 0; 40} 41 42int main(void){ 43 char command[80]; 44 char *p; 45 while(1){ 46 printf(">"); 47 fgets(command,80,stdin); 48 if( (p = strrchr(command,'\n')) != NULL){ 49 *p = '\0'; 50 }do_command(command); 51 }return 0; 52}

投稿2022/02/27 04:40

shiracamus

総合スコア5406

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

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

yochan0913

2022/02/27 12:53

コードまでコピペしやすく解説していただきありがとうございました!無事動きました!
guest

0

ベストアンサー

'\'+1文字は"エスケープシーケンス"です。コンパイラによってコンパイル環境にあった文字もしくは文字列に変換されます。

Windows では \n は 0x0d,0x0a という 2 バイトに変換され、つまり文字では無く文字列になりますので「'」で囲むのは適さない…ということになるのではないでしょうか。
文字列の中から改行を探すのでしたら strstr で ”\n” をパラメータとしてみては如何でしょう。

'\0' のほうは *p が char 型なのに対し '\0' が int に解釈されて large とか…見た目のまま 2 文字なのでエラーとか…あんまり無さそうですが(デフォルトの)コンパイルオプションでそのような設定になっているのかもしれません。
いっそ *p = (char)0; にしてみるのは如何でしょうか。

投稿2022/02/27 04:05

編集2022/02/27 09:22
jimbe

総合スコア12648

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

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

majiponi

2022/02/27 04:25

あれ、windowsのテキストモードだと、ファイルから読み取ったときにcrlfをlfに直して、書き込むときにlfをcrlfに変換したような気がするのですが…? (つまり、ソースコード上ではlfだけでOK)
jimbe

2022/02/27 04:46

コンパイラが言っているは定数の方と思っています。
yochan0913

2022/02/27 06:27

*p = '\0';の¥0を\0に変更したら動きました!理由や他の手法まで詳しく解説していただきありがとうございます。助かりました。
otn

2022/02/27 08:43

> Windows では \n は 0x0d,0x0a という 2 バイトに変換され、つまり文字では無く文字列になります 間違っています。 > '\0' のほうは *p が char 型なのに対し '\0' が int に解釈されて large とか… これも関係ないです。char型にint値を代入するのはごく普通です。 > ¥0を\0に変更したら動きました! その通りで、原因は、バックスラッシュと円記号の間違いです。
jimbe

2022/02/27 09:17

>> Windows では \n は 0x0d,0x0a という 2 バイトに変換され、つまり文字では無く文字列になります >間違っています。 自身の中で原因が特定できてなかったので表現の仕方も含めて無責任な書き方になってしまいました。 > '\0' のほうは *p が char 型なのに対し '\0' が int に解釈されて large とか… これも関係ないです。char型にint値を代入するのはごく普通です。 私も「ごく普通」にそのように書いていますので、何故そうなるのか分かっていませんでした。 何かそのようにするオプションでもあるのかと思ったのはその為です。 >> ¥0を\0に変更したら動きました! >その通りで、原因は、バックスラッシュと円記号の間違いです。 エスケープシーケンスにするつもりが単なる 2 文字となってしまっていて "「'」で囲むには large だ" と言われていたということでしょうか。 tetatail 上では見た目全然分からないですね ^^;
jimbe

2022/02/27 09:26

ベストアンサーは bboydaisuke さんにされたほうが良いように思います。
yochan0913

2022/02/27 12:50

更に詳しくありがとうございました!マークダウン修正指摘もありがとうございます。
guest

0

'¥n', '¥0' を '\n', '\0' に変えればよいと思います。Mac か Windows か書いてませんが、Mac だったら ¥ と \ は違う文字になります。

参考: Mac バックスラッシュ 入力方法

投稿2022/02/27 02:36

編集2022/02/27 02:39
bboydaisuke

総合スコア5275

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

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

Zuishin

2022/02/27 02:55

ウィンドウズでも違う文字です。バックスラッシュのグリフが円マークの形をしているフォントが数個採用されているだけです。
yochan0913

2022/02/27 12:52

macとWindowsでは¥と\は違うのですね。知らなかった。ありがとうございます。
guest

0

円記号を、全角文字で打っていませんか? 半角バックスラッシュが円記号で表示されているのであれば問題ないですが…。

投稿2022/02/27 04:21

majiponi

総合スコア1720

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問