• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Cコンソールで助言お願いします。)

Cコンソールでの文字列処理に関する助言をお願いします。

このQ&Aのポイント
  • Cコンソールでの文字列処理に関して助言をお願いします。テキストファイルには不要な情報が多く含まれており、表示したいのは「..ABCDE:」で始まり「..」で終わる文字列のみです。区切りとして「..」を使用し、切り分けた後に「ABCDE」の分だけ8文字分アドレスを進めて表示することを考えています。また、指定した日付のファイルを読み込み、必要なデータのみを表示させたいと思っていますが、ループさせるとわかりづらくなってしまいます。助言をお願いします。
  • Cコンソールでの文字列処理に関する助言をお願いします。テキストファイルには不要な情報が多く含まれており、表示したいのは「..ABCDE:」で始まり「..」で終わる文字列のみです。区切りとして「..」を使用し、切り分けた後に「ABCDE」の分だけ8文字分アドレスを進めて表示することを考えています。また、指定した日付のファイルを読み込み、必要なデータのみを表示させたいと思っていますが、ループさせるとわかりづらくなってしまいます。助言をお願いします。
  • Cコンソールでの文字列処理に関して助言をお願いします。テキストファイルには不要な情報が多く含まれており、表示したいのは「..ABCDE:」で始まり「..」で終わる文字列のみです。区切りとして「..」を使用し、切り分けた後に「ABCDE」の分だけ8文字分アドレスを進めて表示することを考えています。また、指定した日付のファイルを読み込み、必要なデータのみを表示させたいと思っていますが、ループさせるとわかりづらくなってしまいます。助言をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

「..ABCDE:」で始まり「..」で終わる文字列ならば fgets() で1行読んだ後で strncmp() で先頭の方を比較して、'\n' を削除後に 2文字分手前の文字を strcmp() で比較すればいいと思いますよ。 例 while (fgets(str, sizeof(str), fp)) {  size_t len = strlen(str);  /* 改行を含めて11バイト未満は決して一致しないので読み飛ばす。 */  if (len < 11) continue;  str[len - 1] = '\0'; /* 改行を削除する。 */  len--; /* lenを現在の長さと同じにする。 */  if (strncmp(str, "..ABCDE:", 8) == 0 && strcmp(&str[len - 2], "..") == 0) {   /* 一致したので出力する。 */   /* 最後の ".." は不要なので削除する。 */   str[len - 2] = '\0';   /* 先頭8文字よりも後を出力する。 */   puts(&str[8]);  } }

t_turbo
質問者

お礼

ありがとうございました。 ようやく解決しました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • sscanfでフォーマットに合っているかを調べるには。

    今,Cの関数で0-9,A-Zの4文字以内の文字列かどうか を調べたいのですが, int main() { int i; char str[] = "ABCD" /* 調べたい文字列1 */ char str1[]= "ABC@" /* 調べたい文字列1 */ char str2[]= "ABCDE" /* 調べたい文字列1 */ char *p; p = str; /* ここをstr1,str2に変える */ if (strlen(p) != 4) printf("エラーです\n"); for (i = 0; i < 4; i++) { if (!isupper(p[i]) && !isdigit(p[i])) { printf("えらーです\n"); return EXIT_FAILURE; } } printf("すべてOKです\n"); return EXIT_SUCCESS; } というようにすれば,strとstr1とstr2がフォーマットに合うかわかるのですが,これをsscanfの正規表現を使用して実装したいのですが,可能でしょうか。 int main() { int ret; char str[] = "ABCD" /* 調べたい文字列1 */ char str1[]= "ABC@" /* 調べたい文字列1 */ char str2[]= "ABCDE" /* 調べたい文字列1 */ char *p; chat tmp[30]; p = str; ret = sscanf(p, "%4[0-9A-Z]", tmp); if (ret != 1) { printf("エラーです\n"); return EXIT_FAILURE; } printf("すべてOKです\n"); return EXIT_SUCCESS; } といしょうとするならば,str1のときは,@までのABCの文字列がとれて,retには1が帰ってきてしまいます。 なにか4文字以内ということを実装できる正規表現の使い方はあるのでしょうか? ちなみに sscanf(str, "%1[0-9A-Z]%1[0-9A-Z]%1[0-9A-Z]%1[0-9A-Z]", tmp1, tmp2, tmp3, tmp4) という以外でわかる方,よろしくおねがいします。

  • 下記のプログラムがコンパイラでエラーになります。

    いつも教えて頂きありがとうございます。 実は基本を理解しておらず、キーパンチの練習になっています。 もう1冊自分にも解る書籍を購入しようと思います。 このプログラムの誤りだけでも教えて頂きたいのです。 2000文字では足りないので、2回に分けて投稿させて頂きます。 下記のプログラムです。 /***************************************************** 基本交換法による並べ替えを行うプログラム ******************************************************/ #include <stdio.h> #define N 7 /*データ個数*/ #define ON 1 /*sw : 交換しました*/ #define OFF 0 /*sw : 交換していません*/ #define DATA_LEN 20 /*データ配列の1列の要素数*/ /*関数のプロトタイプ宣言*/ void printData(char p[][DATA_LEN], int n); /*文字列を表示する関数*/ void sort(char p[][DATA_LEN], int n); /*文字列を並び替える関数*/ void str_change(char *ps1,char *ps2); /*文字列と文字列とを交換する関数*/ void atr_cpy(char *pd,char *ps) /*文字列を複写する関数*/ int str_cmp(char *ps1,char *ps2) /*文字列と文字列とを比較する関数*/ main() { /*データの宣言*/ char p_data[N][DATA_LEN] = {"ふじさわ","えのしま","しちりがはま", "ごくらくじ","はせ","ゆいがはま","かまくら"}; /*最初の状態を表示*/ printData(p_data,N); /*並べ替え*/ sort(p_data,N); /*結果を表示*/ printf("¥nソ¥ートしました¥n¥n"); printData(p_data,N); } /**************************************************** ポインタ型から文字列を表示 ****************************************************/ void printData(char p[][DATA_LEN], int n) /* p : 二次元配列*/ /* n : 文字列の要素数*/ { int i; /*添え字*/ for(i=0;i<n;i++) { printf("%s¥n",p[i]); } } /***************************************************** 基本交換法 *****************************************************/ void sort(char p[][DATA_LEN],int n) /* p : 二次元配列*/ /* n : 文字列の要素数*/ { int sw; /*交換したか*/ int i,j; /*添え字*/ sw = ON; for(i = n-1 ; i>=1 && sw == ON ; i--) { sw = OFF; for(j = 0; j< i ;j++) { /* p[j] <= p[j+1]となるようにする*/ if(str_cmp(p[j],p[j+1]) > 0) { str_change(p[j],p[j+1]; /*交換*/ sw = ON; } } } } もう1回投稿致します。

  • C言語についてなのですが・・・

    さきほども上げたのですがカテゴリが間違っていたのでもう一回書き込みました まだプログラムの勉強をはじめた初心者なのですが、 テキストファイルから文字を読みこみ、大文字ならば小文字に変換し辞書順に並びかえるプログラムを作っているのですがどうしてもうまくいきません。 例えばtest.txtに XXX YYY YY XX BBB aaa aa BB とあれば aa aaa bb bbb xx xxx yy yyy と表示されるよにしたいんです。 自分が作ったプログラむはこれです。 まだテキストファイルからでなくキーボードからの入力になっていますが・・・ #include<stdio.h> #include<stdlib.h> #include<string.h> #include <ctype.h> int soto( const void *x, const void *y); int main(int argc, char *argv[]){ FILE *input; char str1[1000]; int i, j; for (i = 1; i < argc; i++){ qsort(argv[i], 1000, sizeof( char *), soto); strcpy(str1, argv[i]); for(j = 0; j < 100; j++){ str1[j] = tolower( str1[j] ); } printf("%s\n", str1); } return 0; } int soto( const void *a, const void *b){ char *x, *y; x = (char*)a; y = (char*)b; return x-y; } これだと小文字にはなるんですがソートされずに表示されてしまいます・・・ どのようにすればいけるのかご指摘のほどおねがいします

  • C言語 初心者です。

    今、英単語帳を作っているのですが、以下のソースではできません。 作ろうとしているプログラムは、a bを登録した場合、次がaabと来たら、 a aab bといったようにしたいのですが、できません。教えてください。 #include <stdio.h> #include <string.h> #define NUMBER 50 /*--- 単語帳の構造体*/ typedef struct { char *word; } words; /*--- 文字列strから文字列wordを検索する ---*/ char *str_chr(const char *str, int w) { for ( ; *str; *str++){ if (*str == w){ return ((char *)str); } } return (NULL); /*検索したが該当しないときはNULLを返す*/ } /*--- 単純交換ソート ---*/ void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /*--- 配列dataの先頭n個の要素を昇順にソート ---*/ void sort(words data[], int n) { int k = n - 1; while (k >= 0){ int i, j; for (i = 1, j = -1; i <= k; i++) if (data[i - 1].word > data[i].word){ j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { words word[NUMBER][20] = {{0},{0}}; char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char w[128], *p; int count = 0; do{ printf("単語を入力してください。:"); /*単語を入力する*/ scanf("%s", w); p = str_chr(str, w); }while(p == NULL); count++; if(count >= NUMBER){ /*登録件数を調べる*/ printf("件数いっぱいです。\n"); } return (0); sort(word, NUMBER); return (0); }

  • C言語について

    2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか? /*文字列連結*/ void *my_stract(char*, char*, char*); void main(void) { char bun1[100],bun2[100],bun3[200]; printf("文字列1を入力してください\n"); gets(bun1); printf("文字列2を入力してください\n"); gets(bun2); my_stract(bun1,bun2,bun3); puts(bun3); } char *my_stract(char *str3, char *str2, char *str1) { char *p1, *p2, *p3; p1=str1; p2=str2; p3=str3; while(*p1) { *p3=*p1; p1++; p3++; } while(*p2) { *p3=*p2; p2++; p3++; } *p3='\0'; return str3; }

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • C言語の課題に取り組んでいるんですが・・・

    まだプログラムの勉強をはじめた初心者なのですが、 テキストファイルから文字を読みこみ、大文字ならば小文字に変換し辞書順に並びかえるプログラムを作っているのですがどうしてもうまくいきません。 例えばtest.txtに XXX YYY YY XX BBB aaa aa BB とあれば aa aaa bb bbb xx xxx yy yyy と表示されるよにしたいんです。 自分が作ったプログラむはこれです。 まだテキストファイルからでなくキーボードからの入力になっていますが・・・ #include<stdio.h> #include<stdlib.h> #include<string.h> #include <ctype.h> int soto( const void *x, const void *y); int main(int argc, char *argv[]){ FILE *input; char str1[1000]; int i, j; for (i = 1; i < argc; i++){ qsort(argv[i], 1000, sizeof( char *), soto); strcpy(str1, argv[i]); for(j = 0; j < 100; j++){ str1[j] = tolower( str1[j] ); } printf("%s\n", str1); } return 0; } int soto( const void *a, const void *b){ char *x, *y; x = (char*)a; y = (char*)b; return x-y; } これだと小文字にはなるんですがソートされずに表示されてしまいます・・・ どのようにすればいけるのかご指摘のほどおねがいします

  • C言語 文字列操作

    トリム関数とリムーブ関数を作成してみました。改良点はありますでしょうか? ~~~~以下ソース~~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> char *Trim(char *str); char *Remove(char *str, char *rmv); void main(void) {  char str[10], rmv[10], *p;  int c;  /* " abcd "をトリムする */  strcpy(str, " abcd ");  printf("トリム前 |%s|\n", str);  p = Trim(str);  printf("トリム後 |%s|\n", str);  /* 指定文字列を削除する */  printf("削除する文字列を入力してください :");  scanf("%s", rmv);  Remove(str, rmv);  printf("削除後 |%s|\n", str);  exit(0); } char *Trim(char *str) {  char space[] = " ";  char null[] = "";  int index = 0;  while(1){   if(strcmp(&(str[index]), null) == 0){    index--;    if(strncmp(&(str[index]), space, 1) == 0){     strcpy(&(str[index]), &(str[index]) + 1);    }else{     break;    }   }else{    if(strncmp(&(str[index]), space, 1) == 0 && index == 0){     strcpy(&(str[index]), &(str[index]) + 1);    }else{     index++;    }   }  }  return str; } char *Remove(char *str, char *rmv) {  int c, size, i;  char *p;  c = '\0';  p = strchr(rmv, c);  size = p - rmv;  for(i = 0; i < size; i++){   c = (int)rmv[i];   p = strchr(str, c);   if (p != NULL) {    strcpy(&(str[p-str]), p + 1);   }   else{    printf("""%c""は見つかりませんでした\n", c);   }  }  return str; }

  • 検索するプログラミング

    C言語の問題で、ユーザが文字列を入力し、半角英数字の入力(最大でも1000文字)を改行があるまで受け付ける。次に、ユーザに検索する文字列(最大でも半角20文字)を入力させ、はじめに入力された文字列内にあるかどうかを表示するプログラムを作成する。配列の外部を参照しないように注意する。そのプログラム内で以下の関数を完成させる。 int str_srch (char str [], char srch_str[]) : 文字列strの中に文字列srch_strが含まれていれば、1を返し、含まれていなければ0を返す関数とする。 このような感じになると思うのですがどなたか分かりませんか? int str_compare(char *s1, char *s2) { //文字列s1の先頭にs2が含まれていれば等しいければ1、 //そうでなければ0を返す //while文を利用して、s2の1文字目からs2がヌル文字になるまで //繰り返し、s1の対応する文字と等しいかどうかチェック //s2の最後の文字まで等しければ、1 //そうでなければ0を返す } int str_length(char *str) { //文字列strの長さを返す } int str_srch(char *str, char *srch_str) { int strlen, srch_strlen; int i,j=0; strlen =str_length(str); //文字列strの長さ srch_strlen =str_length(srch_str); //文字列srch_strの長さ for(i=0;i<strlen;i++){ //strのi文字目からにsrch_strがあるかどうか  j=j+str_compare(&str[i], srch_str) } //jは文字列srch_strが文字列strに何回含まれているか、を表す //jが1より多くなれば1を返し //jが0なら0を返す }