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

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

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

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

Q&A

解決済

4回答

8589閲覧

C言語において連続した文字列の作成及びhファイルからの文字列の表示方法

omiteratail

総合スコア19

C

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

0グッド

0クリップ

投稿2017/10/23 23:11

###前提・実現したいこと
すごく初歩的なことで申し訳ないのですが、質問させてください。
aが256個続く文字列を作りたいのですが、

c

1#include <stdio.h> 2#include <stdlib.h> 3#include "hogehoge.h" 4 5int main(){ 6 7 char str[10]="AAAAA"; 8 int i; 9 printf("%s",hogehoge); 10 11 for(i=0; i<10; i++){ 12 str[i] = "a"; 13 } 14 15 for(i=0; i<10; i++){ 16 printf("%c",str[i]); 17 } 18 19 return 0; 20} 21

とすると、
出力結果が
??????????
となってしまい、Aで表示されません。
また、gccでコンパイラすると

test.c:13:16: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [2]' [-Wint-conversion] str[i] = "a"; ^ ~~~ 1 warning generated.

といったエラーが出てきてしまうのもよくわかっておりません。

MacOS Sierraを使用しております。
よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

他の方のご回答にもあるように、まずは文字と文字列の違いを理解することが大切です。
C言語では、1文字はchar型の値を、文字列は最後が終端文字\0で終わるchar型の配列として扱います。
そのため、256文字の文字列を扱う場合、終端文字を含めるために1文字分多く配列を宣言する必要があります。

ご質問の内容は下記のように書けるかと思います。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define MAX 256 5 6int main(void) 7{ 8 char str[MAX + 1]; 9 int i; 10 11 for (i = 0; i < MAX; i++) 12 { 13 str[i] = 'a'; 14 } 15 str[i] = '\0'; 16 17 printf("%s\n", str); 18 19 return 0; 20}

また、文字列の文字数が動的となる場合は、下記のようにmalloc等でメモリも動的に確保する必要があります。
ここでは上記との比較のため文字数は固定としています。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define MAX 256 5 6int main(void) 7{ 8 char* str; 9 int i; 10 11 str = (char*)malloc(sizeof(char) * (MAX+1)); /* メモリ確保失敗時の考慮をしていません */ 12 13 for (i = 0; i < MAX; i++) 14 { 15 str[i] = 'a'; 16 } 17 str[i] = '\0'; 18 19 printf("%s\n", str); 20 21 free(str); 22 23 return 0; 24}

追記:

エラーの内容は文字と文字列を同様に扱おうとしているという型に関する警告ですが、"a"がchar [2]となっているのは、文字列"a"が、a\0の2文字から構成されているためです。
固定文字列に対してはあまり行うことはないかもしれませんが、文字列の1文字目であるaを使用したい場合は下記のように参照することも可能です。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define MAX 256 5 6int main(void) 7{ 8 char str[MAX + 1]; 9 int i; 10 11 for (i = 0; i < MAX; i++) 12 { 13 str[i] = "a"[0]; 14 } 15 str[i] = '\0'; 16 17 printf("%s\n", str); 18 19 return 0; 20}

投稿2017/10/23 23:54

編集2017/10/24 00:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

omiteratail

2017/10/24 17:38

suyamaさん 迅速なご回答ありがとうございます。 文字型と文字配列型の理解がまだまだ薄いのでそちらの勉強をしていこうと思います。 ありがとうございました。
guest

0

C

1str[i] = "a";

で文字列リテラル"a"のポインターをstr[i]へ代入しています。この場合はシングルクオーテーションで括って

C

1str[i] = 'a';

です。更に、'\0'で終わっていないので、ループ終了後に末端に'\0'を埋める必要があります。

C

1 for(i=0; i<10; i++){ 2 str[i] = 'a'; 3 } 4 str[9] = '\0';

test.c:13:16: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [2]'

は、「charの配列(ポインター)からcharへ、互換性の無い変換をしています。」(意訳)と警告しています。

投稿2017/10/23 23:37

編集2017/10/23 23:39
dodox86

総合スコア9183

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

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

omiteratail

2017/10/24 17:36

dodox86さん 迅速なご回答ありがとうございます。 シングルクオーテーションで括るということをすっかり忘れておりました。 また警告文の意訳もありがとうございます。 ありがとうございました。
guest

0

ベストアンサー

環境がないため動かせませんが、これでどうでしょうか。

・aは1文字なのでダブルクォーテーションではなくシングルクォーテーションになります。
・出力は1文字ずつでなく%s指定で文字列を全て出力できたはずです。

#include <stdio.h> #include <stdlib.h> #include "hogehoge.h" int main() { char str[10]="AAAAA"; int i; printf("%s",hogehoge); for(i=0; i<10; i++){ str[i] = 'a'; } printf("%s\n",str); return 0; }

ヘッダからの文字列表示はヘッダで定義されていて
そのヘッダをincludeしているならできたはずです。

hogehoge.h

char str2[10]="AAAAA";

main.c

#include <stdio.h> #include <stdlib.h> #include "hogehoge.h" void main() { printf("%s\n",str2); return; }

投稿2017/10/23 23:32

編集2017/10/23 23:36
yuki-saito

総合スコア928

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

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

omiteratail

2017/10/24 17:34

yuki-saitoさん 迅速かつシングルクォーテーションのご指摘をいただいたのでベストアンサーに選ばせていただきました。 おかげさまで、無事出力することができました。 ありがとうございました。
yuki-saito

2017/10/24 21:38

ありがとうございます???? 解決してよかったです。
guest

0

macでも同じだと思いますが、こんな感じでしょうか?

#include <stdio.h> #include <stdlib.h> #include "hogehoge.h" int main(){ char str[256]="AAAAA"; int i; printf("%s\n",hogehoge); for(i=0; i<256; i++){ str[i] = 'a'; } for(i=0; i<256; i++){ printf("%c",str[i]); } printf("\n"); return 0; }

hogehoge.h

hogehoge.h

1#define hogehoge "hogehoge"

その他

c

1#include <stdio.h> 2#include <stdlib.h> 3#include "hogehoge.h" 4 5int main(){ 6 char str[256]="a"; 7 int i; 8 printf("%s\n",hogehoge); 9 10 for(i=0; (i+1)<256; i++){ 11 str[i+1] = str[i]; 12 } 13 14 for(i=0; i<256; i++){ 15 printf("%c",str[i]); 16 } 17 printf("\n"); 18 19 return 0; 20}

投稿2017/10/23 23:26

編集2017/10/24 00:02
A.Ichi

総合スコア4070

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

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

omiteratail

2017/10/24 17:33 編集

A.Ichiさん 迅速なご回答ありがとうございます。 str[i]='a' のところで"a"としていたのがいけなかったようです、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問