c言語でポインタ変数を用いた配列の反転操作を行いたいのですが、文字列の反転の仕方が分かりません。流れとしては、文字列の長さを調べてから文字列を反転して表示するという感じです。どうか教えてください。また、その他問題点があればご指摘よろしくお願いします。

#include <stdio.h>

int strlength(char *str) { /* 文字列の長さを調べる /*
int length = 0;

while (*str++ != '\0'){
length++;
}
return length;
}

int main(void) { /*配列strSrc[]の文字列を逆にして配列strDst[]に格納する */
char strSrc[] = "reverse this";
char *pC;
char strDst[] = "01234567890123456789";
char *pD;
int length;

printf( "%s\n", strSrc );

/* この部分が分かりません */

printf("%s\n", strDst ) ;

return( 0 );
}

このQ&Aに関連する最新のQ&A

A 回答 (15件中1~10件)

質問者さんの意図を素直に読み取ると、こんなのでもいいかも。



#include <stdio.h>
#include <string.h>

int main(void)
{
char s[] = "reverse this", *p, *q, t;

printf("逆転前:%s\n", s);
for (p = s, q = &s[strlen(s)-1]; p < q; p++, q--) {
t = *p, *p = *q, *q = t;
}
printf("逆転後:%s\n", s);
return 0;
}
    • good
    • 0

>流れとしては、文字列の長さを調べてから文字列を反転して表示するという感じです。



>/*配列strSrc[]の文字列を逆にして配列strDst[]に格納する */

 質問者様の「望む結果」は、No.2 さんのような結果の他に、

 "siht esrever23456789" とも考えられます(特にソースから)。

 これを実現するソースを回答します。

( No.2 さんのような結果を望むのであれば、格納後、出力直前に strDst[ iLength + 1 ] = '\0'; )

#include <stdio.h>
#include <string.h>

int main( void )
{
 char strSrc[] = "reverse this";
 char strDst[] = "01234567890123456789";
 char *pS = strSrc;
 char *pD = strDst;
 int iLength;

 iLength = strlen( strSrc ) - 1; // - 1 に注意

 printf( "%s\n", strSrc );

 pD += iLength; // 長さ分、後方へ

 while( *pS ){

  *pD = *pS; // 1文字ずつ「格納する」

  pS++; // 後方へ
  pD--; // 前方へ
 }
 printf( "%s\n", strDst );

 return( 0 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0

>#12さん


そりゃそうですね。これは一本取られました。:D
    • good
    • 0

>#10, 11


それをやるならいっそ「文字列の最後から先頭に向けて1文字ずつ画面表示」してしまえば入れ替えルーチンすら不要ですが。
    • good
    • 1

>・先頭と最後を入れ替える



言わずもがなですが、ここでいう「最後」とは'\0'のことではないです。
    • good
    • 0

対象配列の


・先頭と最後を入れ替える
・先頭の次と最後の前を入れ替える
・…
を適切に繰り返せば、strDst[]は不要で、十分な領域が必要云々の議論も不要ですね。
    • good
    • 0

受け手になる strDst に十分な領域を確保しなきゃいけないのは #8 の通りで, 正攻法で行くなら malloc で動的に確保するんだけど手を抜くなら (今の場合は)


char strDst[sizeof strSrc];
でも OK.
あと, 本当は「文字列を反転する」という関数を作った方がいいような気がする. インターフェースは string.h の strcpy/strncpy とか (標準にはないけど) strdup に合わせる方向で.
    • good
    • 0

逆順コピーの手順自体は既に書かれています(※)が、元コードはもともとstrSrcがstrDstより長いとエラーになる、という問題を抱えています。


※敢えて言うなら#7の手順はどこかでstrDstの終端を入れる必要がある、というくらい

汎用性を上げるならstrDstは動的に確保する方がいいです。
char *strDst;
strDst = malloc(sizeof(char) * (length + 1));

length + 1で確保するのはlengthに渡る値が終端文字分を含まないためです。
    • good
    • 0

#6さんへ



>2) 文字列の先頭アドレスを ポインタpCに代入
>3) 文字列の末尾アドレスを ポインタpDに代入
>3) ループで末尾側と先頭側を入れ替え

これだと、「配列strSrc[]の文字列自体を逆にする」という仕様になります。しかし、元の質問では「配列strSrc[]の文字列を逆にして配列strDst[]に格納する」という仕様なので、違ったものになってしまいますね。
strSrcの内容を逆にしてからstrDstにコピーするのなら結果は一緒ですが、おそらく出題の意図からは外れてしまうと思います。
なのでここは、下記のような流れになるかと。

2) strSrcの先頭アドレスを ポインタpCに代入
3) strDstの末尾アドレスを ポインタpDに代入
4) 文字列の長さ分、下記を繰り返す
4-1) pC→pDに値を代入
4-2) pCをインクリメント
4-3) pDをデクリメント
    • good
    • 0

考え方は


1) 元の文字列の長さを取得
2) 文字列の先頭アドレスを ポインタpCに代入
3) 文字列の末尾アドレスを ポインタpDに代入
3) ループで末尾側と先頭側を入れ替え
  pCをインクリメント ... 末尾側へ移動
  pDをデクリメント ... 先頭側へ移動
4) pCとpDを比較して交差するかまたは同一ならループ終了
  要素が偶数なら ... 交差
  要素が奇数なら ... 同一
といった具合でしょう

4)の判定ですが
01234567890123456789 この文字列を処理していくと
98765432190876543210 10回目のループで 10文字目の『9』と11文字目『0』の入れ替えをします
これで98765432109876543210が逆順になり完成します
このとき pCとpDは
pC = &strDst[9], pD = &strDst[10] です
ループでpC++ pD-- を実行すると
pC = &strDst[10], pD = &strDst[9] になり交差します

奇数だった場合は pC = &strDst[9], pD = &strDst[9] のように中心の文字を指すときがありますのでこれを終了条件にします

このようにして終了判定をしないと せっかく逆順にした文字列を
もう一度逆順に加工してしまい 結果として逆順の逆順つまり元通りにしてしまうことがあります
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字列の反転

こんばんわ。C言語初学者の者です。早速質問させてください。
(1)
char a;
aの中身には、アルファベット小文字の文字列が5個並んでいるとします。
その文字列を前後反転させるにはどうすればいいでしょうか?
例えばabcdeと並んでいる文字列をedcbaとする場合です。(キーボードからabcdeと打ち込んだとき、aにedcbaと格納させたいのです)


(2) char a;
  char b;
 中身は文字列で、二つを合体させたい場合どうすればいいのでしょうか?
 例えば aにはth 、bにはatと格納されている場合thatと繋げたいのです。

 よろしくお願いします。

Aベストアンサー

(1)
皆様がおっしゃっているように、char aには1文字しか入りません。
適宜修正しつつプログラムを書くとこんな感じでしょうか。

char a[128]; // 最大127文字
int i;
int length;

scanf("%s", a);
printf("input str = %s\n", a);

length = strlen(a);
for(i=0; i<length/2; i++){
// a[i] と a[length-i-1] を交換
char tmp;
tmp = a[i];
a[i] = a[length-i-1];
a[length-i-1] = tmp;
}

printf("output str = %s\n", a);

手元ではこれで
input str = abcde
output str = edcba
と出力されました。

(2)はstrcat()という関数でできます。

char a[128] = "hello";
char b[128] = " world";
strcat(a, b);
printf("%s\n", a);

これで
hello world
と出力されます。

(1)
皆様がおっしゃっているように、char aには1文字しか入りません。
適宜修正しつつプログラムを書くとこんな感じでしょうか。

char a[128]; // 最大127文字
int i;
int length;

scanf("%s", a);
printf("input str = %s\n", a);

length = strlen(a);
for(i=0; i<length/2; i++){
// a[i] と a[length-i-1] を交換
char tmp;
tmp = a[i];
a[i] = a[length-i-1];
a[length-i-1] = tmp;
}

printf("output s...続きを読む

QC言語 逆順の配列の仕方を教えてください

今、大学でC言語の課題をやっています。サンプルが与えられています。
その課題は、配列の逆順です。

for文を使って、実行結果は以下のようにならなければならなく、「並び替えの結果は再び num1, num2 に保存される」という条件なのですが、逆順になるにはどのようなプログラムを組めば良いのでしょうか?
ソースの「 /* ここに処理を書く */」にプログラムを書かなければいけないのですが、まったくの初心者でわかりません。誠にお手数ですが、教えていただければ幸いです。宜しくお願いいたします。

-----実行結果-----

C:\c_lang>reverse
--- before ---
2 4 9 10 5 3 1 7 8 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
--- after ---
6 8 7 1 3 5 10 9 4 2
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1


-----以下ソース-----
#include <stdio.h>

void print_num( int *num, int len );
void reverse_num( int *num, int len );

int main( void )
{
int num1[10]={2,4,9,10,5,3,1,7,8,6};
int num2[15]={1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15};

printf("--- before ---\n");
print_num( num1, 10 );
print_num( num2, 15 );

/* 逆順に並べ替え */
reverse_num( num1, 10 );
reverse_num( num2, 15 );

printf("--- after ---\n");
print_num( num1, 10 );
print_num( num2, 15 );

return 0;
}

void print_num( int *num, int len )
{
int i;
for( i=0; i<len; i++ ){
printf( "%d ", num[i] );
}
printf("\n");
}

void reverse_num( int *num, int len )
{
/* ここに処理を書く */
}

-----ソースここまで-----

今、大学でC言語の課題をやっています。サンプルが与えられています。
その課題は、配列の逆順です。

for文を使って、実行結果は以下のようにならなければならなく、「並び替えの結果は再び num1, num2 に保存される」という条件なのですが、逆順になるにはどのようなプログラムを組めば良いのでしょうか?
ソースの「 /* ここに処理を書く */」にプログラムを書かなければいけないのですが、まったくの初心者でわかりません。誠にお手数ですが、教えていただければ幸いです。宜しくお願いいたします。

--...続きを読む

Aベストアンサー

>元ソースの下部にある「 /* ここに処理を書く */」のとこだけしか記述できません。

まさにその位置へ、皆さんのヒントを実装するんです。

void reverse_num( int *num, int len )
{
}
↑大前提。これが「関数」というものですが分かりますか?

これの呼び出し元を参照すると
>reverse_num( num1, 10 );
となっています。

num1とはなんぞや、というと
>int num1[10]={2,4,9,10,5,3,1,7,8,6};

以上からreverse_num()に渡す第1引数(型: int*)には&num1[0]、
次の引数lenには要素数が渡されることになりますね。

reverse_num関数に入った直後は、
num + len が、ラストの次の要素を指すことになります。

これでもう分かりますね。仕上げはご自分で頑張って下さい。

QC言語で、入力された、文字列を逆に並べるプログラム。

タイトルのとおりのプログラムをつくりたいんです。
例えば、abcと入力したら、cbaと返してくれるものです。
条件として、ポインタを使えと言われています。
自分で書いたソースは、

0: #include<stdio.h>
1: char re(char *s);
2: main()
3: {
4:char s[10];
5:gets(s);
6:re(s);
7:printf("%s\n",s);
8: }
9:
10: char re(char *s){
11:char c[10];
12:
13:c[9]=s[0];
14:c[8]=s[1];
15:c[7]=s[2];
16:c[6]=s[3];
17:c[5]=s[4];
18:c[4]=s[5];
19:c[3]=s[6];
20:c[2]=s[7];
21:c[1]=s[8];
22:c[0]=s[9];
23:
24:return c[10];
}

C言語を勉強し始めたばかりで、なかなか思うようにかけないでいます。
文字列を入力するのは、4行目~7行目で大丈夫だと思うんですよ。
文字列を逆に並べる、関数 re(char *s)を作れずにいます。
配列s[10]に入っている、文字を最後から取り出して、c[10]にいれていけば、ひっくり返ると思っているんですが、作れません。
13行~21行目の作業も、whileかforでループさせるべきなのもわかってるんですが、条件をどうしたらいいか分からずに作れずにいます。今のソースのまま実行しても、入力したまま出力してしまいます。
さらに、ポインタも今日はじめて勉強して、うっすらと知ってるくらいなので、アドレスとかが、イメージできないでいます。
ながくなってすいません。アドバイスいただきたいです。よろしくおねがいします。

タイトルのとおりのプログラムをつくりたいんです。
例えば、abcと入力したら、cbaと返してくれるものです。
条件として、ポインタを使えと言われています。
自分で書いたソースは、

0: #include<stdio.h>
1: char re(char *s);
2: main()
3: {
4:char s[10];
5:gets(s);
6:re(s);
7:printf("%s\n",s);
8: }
9:
10: char re(char *s){
11:char c[10];
12:
13:c[9]=s[0];
14:c[8]=s[1];
15:c[7]=s[2];
16:c[6]=s[3];
17:c[5]=s[4];
18:c[4]=s[5];
19:c[3]=s[6];
20:c[2]=s[7];...続きを読む

Aベストアンサー

char re(char *s) → void re(char *s)に変更して。

void re(char *s)
{
 char *p;
 p=s+strlen(s)-1;
 while(s<p){
  c=*s;
  *s=*p;
  *p=c;
  s++;
  p--;
 }
}

これでどうでしょうか? pの初期値は末尾の文字の位置です。
先頭と末尾の文字を順番に入れ替えながら内側に進めます。

Qc言語の文字列の逆順のプログラムがわかりません

文字列を逆順して出力するプログラミングがわかりません。
#include <stdio.h>
#include <string.h>

void reverse(char *moji, char *gyaku);

int main(void)
{
char x[30];
char y[30];

puts("文字を入力してください。\n");
scanf("%s", x);

reverse(x, y);

printf("逆順すると%sです。\n", y);

return (0);
}

void reverse(char *moji, char *gyaku)
{
int i, len;

len = strlen(moji);

gyaku = moji + len - 1;

for(i = 0; i < len; i ++){
putchar((int)*gyaku);
gyaku--;
}
}


理想とする実行結果は
文字を入力してください。
abcdefg
逆順するとgfedcbaです。

なんですが、
上記のソースを実行すると

文字を入力してください。
abcdefg
gfedcba逆順すると(謎の漢字)です。

となります。

どこがおかしいんでしょうか?
よろしくおねがいします。

文字列を逆順して出力するプログラミングがわかりません。
#include <stdio.h>
#include <string.h>

void reverse(char *moji, char *gyaku);

int main(void)
{
char x[30];
char y[30];

puts("文字を入力してください。\n");
scanf("%s", x);

reverse(x, y);

printf("逆順すると%sです。\n", y);

return (0);
}

void reverse(char *moji, char *gyaku)
{
int i, len;

len = strlen(moji);

gyaku = moji + len - 1;

for(i = 0; i < len; i ++){
putchar((int)*gyaku);
...続きを読む

Aベストアンサー

> gyaku = moji + len - 1;

 最終的な gyaku の終端を決めるのに moji は直接関係しません。moji の長さだけです。

#include <stdio.h>
#include <string.h>

void reverse( char *moji, char *gyaku )
{
 int len;

 len = strlen( moji );

 gyaku += ( len - 1 ); // moji とは直接関係なし

 while( *moji ){

  *gyaku = *moji;

  putchar( *gyaku );

  gyaku--;
  moji++;
 }
}
void main()
{
 char x[30] = "123456789";
 char y[30] = { 0x00 }; // 初期化

 reverse( x, y );

 printf( " 逆順すると %s です。\n", y );
}
注:インデントに全角空白を用いています。タブに一括変換して下さい。

> gyaku = moji + len - 1;

 最終的な gyaku の終端を決めるのに moji は直接関係しません。moji の長さだけです。

#include <stdio.h>
#include <string.h>

void reverse( char *moji, char *gyaku )
{
 int len;

 len = strlen( moji );

 gyaku += ( len - 1 ); // moji とは直接関係なし

 while( *moji ){

  *gyaku = *moji;

  putchar( *gyaku );

  gyaku--;
  moji++;
 }
}
void main()
{
 char x[30] = "123456789";
 char y[30] = { 0x00 };...続きを読む

Q配列の逆順コピー

for文を使って、配列xの並びを逆順にしたものを配列yにコピーするプログラムを作りたいのですがうまくいきません。どうすればよいでしょうか?
#include<iostream.h>

int main(void){
int i,j;
int x[5]={1,2,3,4,5};
int y[5];
for(i=4;i>=0;i--){
for(j=0;j<5;j++){
x[i]=y[j];
}
}
for(j=0;j<5;j++)
cout<<y[j]<<endl;
return 0;
}

Aベストアンサー

理由
・yは、まだ何も入っていません。
・2重ループで回しているのでx[i]は必ずy[4]になっています。
なので、
for(i=4;i>=0;i--){
 for(j=0;j<5;j++){
  x[i]=y[j];  ←ここ
 }
}
を、
for(i=4;i>=0;i--){
 y[4-i]=x[i];
}
に変更します。

Qc言語のポインタへの文字列入力についてです。

当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか?
#include <stdio.h>

int main(void)
{
char *a;

scanf("%s", a);
printf("%s", a);

return (0);
}

*aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

Aベストアンサー

ポインターというのは格納された値のアドレスのメモリーを指すための変数です。
一方、配列はデータを格納するためのメモリーを確保して、その先頭のアドレスが入っていますよ。

char *a;
scanf("%s", a);

と書くと、aを初期化せずにaの指す先にscanfで文字列を入れます。
大抵、プログラムが書き込むことを許されていないメモリーに書き込みを行おうとしたことを検出したOSからそのプログラムは強制終了されます。

char *a = "aaaaa";
scanf("%s", a);
となっているとどうなるか。
aは"aaaaa"が格納されているメモリーを指すように初期化されます。
ただ、大抵"aaaaa"は固定値を入れるために書き込みができないメモリーに格納されています。
よって、scanf("%s", a);も書き込みができないところに書こうとしたことをOSに検出され、強制終了となります。

2つ方向があると思います。
1. char a[128];のように宣言し、スタック上にメモリーを確保し、その先頭アドレスが入っているaを渡す方法。
2. mallocなどでヒープにメモリーを確保する方法。

1だと、
char a[128];
scanf("%127s", a);
のように書き、scanfで読み込んだ分をaから始まるメモリーに書くことになりますが、char a[128];で配列を確保しているので書き込みを行うことができ、強制終了はされません。

2だと、
char *a = malloc(128);
scanf("%127s", a);
printf("%s", a);
free(a);
のように書きます。
配列はスタック上に取られ、スタック上に取った値はプログラムがその関数を抜けるときに自動的に解放されますが、mallocで確保したメモリーは自動で解放されないので自分でfreeを呼んで開放する必要があります。

%127sがそろそろ気になっていると思います。
こうやって127文字までしか受け取らないようにscanfに指示しています。
C言語では文字列の最後は終了を示すNUL文字が入るので、確保したメモリーよりも1少ない値となっています。

というわけで、ちゃんとメモリーを確保してからscanfで書き込みましょう。ポインターはあくまでどこかのメモリーアドレスを指すだけで、指した先がちゃんと確保されているかどうかは知りませんから。

ポインターというのは格納された値のアドレスのメモリーを指すための変数です。
一方、配列はデータを格納するためのメモリーを確保して、その先頭のアドレスが入っていますよ。

char *a;
scanf("%s", a);

と書くと、aを初期化せずにaの指す先にscanfで文字列を入れます。
大抵、プログラムが書き込むことを許されていないメモリーに書き込みを行おうとしたことを検出したOSからそのプログラムは強制終了されます。

char *a = "aaaaa";
scanf("%s", a);
となっているとどうなるか。
aは"aaaaa"が格納されている...続きを読む

Qcharと%c , %s の関係について

char型の変数の扱いで悩んでいます。
具体的には以下の二つのプログラムの差異についてです。

----------------------
char c;

scanf("%c", &c);
printf("%c\n", c);

-----------------------
char c;

scanf("%s", &c);
printf("%s\n", &c);

-----------------------


上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。

どちらのプログラムも問題なく動作します。
僕自身は 下のプログラムの printf 関数については間違った使い方なのではないかと思っています。

scanf("%s", &c) は入力された文字のうち、終端文字の手前までの文字を引数のポインタが示すオブジェクトへ順に格納していく関数だと理解しているので、入力された文字が一文字だった場合、&cの示すオブジェクトに文字が代入されると考えたからです。

逆に printf("%s", &c) は、&cの示すオブジェクトから”ヌル文字”の手前までの文字列を順に表示する関数だと理解しているので、問題なく動作しているのは&cで示されるオブジェクトの後ろの領域が偶然'\0'だったからではないかと考えたからです。

何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。


僕の考え方がどの程度正しくて、正確にはどうなのかを教えて欲しいです。


ちなみに、

-----------------------
char c;
char str[100];

scanf("%s", str);
scanf("%c", &c);
------------------------

と書くと c には改行文字が代入されてしまいます。
scanf("%s", str);
において"aasssdd "と最後に空白を入れると
c には空白文字が代入されます。

しかし、
--------------------------
char str1[100];
char str2[100];

scanf("%s", str1);
scanf("%s", str2);
--------------------------
においては、
scanf("%s", str1);
で "asdfg "と最後に空白を入れても次のstr2が空白で始まることはありません。


この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。
おそらく、
scanf("%s", str);
の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。


分かる方がいましたら回答をよろしくお願いします。

char型の変数の扱いで悩んでいます。
具体的には以下の二つのプログラムの差異についてです。

----------------------
char c;

scanf("%c", &c);
printf("%c\n", c);

-----------------------
char c;

scanf("%s", &c);
printf("%s\n", &c);

-----------------------


上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。

どちらのプログラムも問題なく動作します。
僕自身は 下...続きを読む

Aベストアンサー

> char c;
> scanf("%s", &c);
char c では1文字分の領域しか確保されていないので、
1文字以上の文字列を無理矢理格納すると
他のデータが存在しているかもしれない領域を書き換えてしまいます。(メモリ破壊)

なお、'\0'はscanfが(本来書き込んではいけない領域に対してですが)書き込んでいます。


> と書くと c には改行文字が代入されてしまいます。
最初のscanfが改行文字を読み込んでいないからです。
以下のページに書かれている内容と本質的には同じ。
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-

> 最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。
そう考えて問題ないと思います。

Q文字列ポインタを結合

タイトルの日本語が間違っていたらすみません。。

*x="AB"

*y="CD"
をstring.hを使わずに連結させたものを新しい*strなどに入れることはできますか??(@_@)

Aベストアンサー

// 余裕のある文字列を strに与えておく
char *str = " ";
char *p = str, *w;
for ( w = x; *w != NULL ; w++ ){
*p = *w;
p++;
}
w = y;
while( *w != NULL ) {
*p = *w;
p++;
w++;
}
といった具合でしょう

Q文字列中に含まれる文字の個数をカウントするプログラムについて…

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
cnt++;
str++;
}
return cnt;
}

int main()
{
const char *str="hello,world!";
const ch='o';

int cnt;

cnt=count(str, ch);

printf("%s中に%cは%d個です\n", str, ch, cnt);


return 0;
}

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
...続きを読む

Aベストアンサー

scanf"%s", str)は、バッファオーバーフローの危険と改行文字の食べ残し問題がありますね。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
int main()
{
char ch;
char str[BUFSIZ];
int cnt;

printf("文字列を入力して下さい > ");
fgets(str,BUFSIZ,stdin);

printf("カウントする文字を入力してください > ");
ch = getchar();

cnt=count(str, ch);
printf("%s中に%cは%d個です\n", str, ch, cnt);

return 0;
}

QC言語のプログラムが実行できません。

C言語のプログラムが実行できません。

コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。

これは何のエラーなんでしょうか?
基本的な事かもしれませんが、分かる方宜しくお願い致します。

Aベストアンサー

僕も何度も出したなぁ。

ひとくちにSegmentation faultといっても、それこそさまざまな要因があるので、
これだけで原因を突き止めるのは非常に難しいです。

コンパイルはあくまで文法としてみているだけであり、
処理の流れ、メモリ確保など、プログラムそのものを見ているわけではありません。
このエラーが出るのは文法などよりもっと上位の原因なのです。
たとえばですが。
長さ10の配列があったとして、11番目以降を参照したりすると、
そういうのが出たような気がします。

ですから、変数があれば、その内容をprintf文で逐一出していき、
変な値が入っていないとか、少しずつ直していくしかないと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報