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

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

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

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

Q&A

解決済

4回答

1783閲覧

c言語の文字列 表示

tamura0425

総合スコア37

C

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

0グッド

0クリップ

投稿2018/06/23 06:10

c言語の文字列について、質問があります。
学校の課題で、半角アルファベットで構成された文字列 s と正の整数 n 入力されます。 1文字目から n 文字目までを出力して下さい。

例えば
一度めのscanfでaaaabbbbbaaaaaaaと入力し
二度目のscanfで5とにゅうしょくしたら、初めの五文字が出力される。
上記のプログラム作りたいので、
下記のようにプログラムを書いたのですが上手くいかず困っています。
#include <stdio.h>
int main(void){
int n;/表示文字数/
char s,mozi;/入力する文字と表示させる文字/

scanf("%s",&s); scanf("%d",&n); mozi=s-n; printf("%s",mozi); }

}

皆様お忙しいところ恐縮ですがどうかご教授いただければ幸いです。

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

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

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

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

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

guest

回答4

0

第一に、charは文字型(註)なので、文字列を保持できません。
文字列を持ちたいなら配列にしないといけません。

C

1char s[16];

こうすればsは最大15文字の文字列を保持できます。最後の1要素はヌル文字(終端文字)です。


第二に、『1文字目から n 文字目までを出力』という部分が全く表現できていません。

C

1for(int i = 0; iがn未満; ++i) { 2 sのi文字目を出力; 3} 4printf("\n");

伏せてある部分はご自身で考えてみてください。

別解
sのi文字目をヌル文字に置き換えて、文字列まるごとを出力しても良いです。
破壊的な処理になるのであまり好みではないですが。


註: 厳密には1バイトの数値型で、文字の保管に主に用いられるだけですが。

コードの書き方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
C

投稿2018/06/23 06:20

編集2018/06/23 06:32
LouiS0616

総合スコア35658

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

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

tamura0425

2018/06/23 09:56

お忙しい中ご対応いただき本当にありがとうございました。
guest

0

ベストアンサー

深く考えずに、入力文字の最大数 100文字(改行, 文字列終端記号を含む)とすると、

char s[100]

とし、 sに文字列、nに文字数が入るとすると、(元のコードのまま)

s[n] = '\0' // n+1文字目を終端とする(Cは、'\0'が終端、配列は0から
printf("%s", s);

で良いのでは? ただし、例外処理とか一切、考慮されていません。

Starts1024さんあたりの回答が色々と考慮されていますが、簡単な方法として。

[追記]
大切な事が漏れていました。

scanf("%s", s); // char s[] とすれば、ここは当然、&があってはいけない。あるいは、&s[0]

投稿2018/06/23 09:42

編集2018/06/23 11:17
pepperleaf

総合スコア6383

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

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

tamura0425

2018/06/23 09:56

お忙しい中ご対応いただき本当にありがとうございました。
guest

0

こんにちは、質問欄に

1文字目から n 文字目までを出力して下さい。

おそらく0文字目から (n) 文字目までの出力だと思います。
(配列は0番目から始まるので、)

また、入力した数値nが文字列の長さを超えた場合のエラーも考慮してコードをつくりました。
(もし、不要ならばif文のところを消してください。)

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define BUFSIZE 256 6 7int main(void){ 8 9 char s[BUFSIZE]; 10 char buf[BUFSIZE]; 11 int i,n; 12 13 printf("文字列を入力\n->"); 14 fgets(s,sizeof(s),stdin); 15 s[strlen(s) - 1] = '\0'; //最後の改行を消去 16 printf("数値を入力\n->"); 17 fgets(buf,sizeof(buf),stdin); 18 n = atoi(buf); 19 //入力した数値nが文字列の長さを超えた場合のエラーも考慮 20 //不要ならばif文のところを消してください。 21 if(strlen(s) < n){ 22 n = strlen(s); 23 } 24 printf("入力した文字列の最初から%d個の文字を出力します。\n",n); 25 for(i = 0; i < n; i++){ 26 printf("%c",s[i]); 27 } 28 return 0; 29}

投稿2018/06/23 09:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tamura0425

2018/06/23 09:56

お忙しい中ご対応いただき本当にありがとうございました。
guest

0

何がうまくいかないのでしょうか?

うまくいかないならその理由を提示してください。
( 何がうまくいかなかったのか。 )

妄想でいいなら、

char s, moji; となっていますが、このままだと s, mojiともに変数になります。

2Lのペットボトルに 10Lのコーラを注ぐようなものです。
しかも無理やり。

投稿2018/06/23 06:21

BeatStar

総合スコア4958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問