C言語なら俺に聞け 145
レス数が950を超えています。1000を超えると書き込みができなくなります。
アセンブラでさえオーバースペックでバイナリエディタという場合まである >>851
参考までにアセンブラがオーバースペックなマイコン(SoC)って何処の製品か教えて あるとすればIMSAIとかだろうけど、流石にネタだろ プログラムを動かすボードが貧弱でも開発は豪華なPCでやるんだから最低でもアセンブラ使えるようにはするだろう。
作ったばかりのCPUで他のCPUとの互換性が全くなくアセンブラもまだない、なんていう特殊な状況でない限りは。 組込み屋だけど会社によって状況違うんだなとしみじみ この頃は組み込みって言っても Linux が動いちゃうような小さいボードあるしな。
SDメモリに平気で何Gもデータ入れちゃったりもできるし。なんとういか、時代は変わったよな。
昔は2KBと4KBのROMに詰め込むためにビット単位で削っていたもんな。 組み込みって昔から小っちゃいのから馬鹿デッカいものまであるから一括りにするのが間違い なんかネタレスで返されてるな
とあるLEDアレイの案件では並列に重きを置き
CPUあたりの処理能力は思いっきり低い
なんてのがあったんだが あんまりそれすると、またハード屋に小言言われるぞ。 int a[] = {0,1,2,3};
char b =0;
scanf("%d",&b);
printf("%d",a[b]);
知恵袋でこんな質問があって俺も不思議に思って持ってきたんだけど
色んな数字入れても0になるとか書かれてたんだけどこれどうなってるの? エンディアンによるような気もするがー
%d は int の大きさを持った器のポインタを要求してるのに
char の大きさの器を渡してるから どうなろうがしったこっちゃない鼻から悪魔系の動作 これがエラーにならず動いてしまうという悪魔のCの動作か char b[4] = {0};
scanf("%d",&b[0]);
printf("%d %d %d %d\n",b[0],b[1],b[2],b[3]);
これをVCとGCCで試してみた
結果は配列先頭要素に代入され、残りは0のままだった >>867
bの型がcharなのが肝なんだからそこは間違えるなよ なるほど、入力値が小さいときは、
後ろの配列が変わってないかのように見えるだけって事か >>868
char 配列の大きさを表す変数が int であっても、あるいはそうでなくても、それは関係ないのでは? >>874
そそ 0でフィルしてるから問題ないようにみえるけど、
0 以外でフィルしてやると副作用おこしてるのがわかるよ >>875
printf ではなく scanf のフォーマットでの %d 指定に char 変数のポインタを渡してる話よ? >>880
GCC だと -Wall を指定すれば警告が出るね。
書式 %d に対して *char の引数 [-Wformat]
配列の添字が char 型 [-Wchar-subscripts] >>881
この1行にアホが詰まってる
会話の内容も実際の動作も用語もわかってないっていう アホな点をいくつ見つけられるかで
各自のアホ度を測定できるな char *line;
scanf("%s", &line);//dogが入る
if(line=="dog")
{
printf("dogですよ");
}
これってなんでdogと合わないん? >>888
scanf で受けとる変数をchar型の配列にしましょう >>888
line=="dog" という式は strcmp関数にしましょう 文字列の比較は == ではなく、strcmp 等の比較関数をつかいましょう C言語はプロ向きの言語
「とりあえず動かしてみる」
とかいう用途には向かない
入門書とかできちんと勉強しよう >char *line;
>scanf("%s", &line);
この2行に色々な罠や誤りが仕込まれてるな。
Cで躓くであろう、ポインタと配列、文字と文字列周辺
(セキュリティや入力のオーバーランは考慮せず簡便なので書くと)
char line[256];
scanf("%s", line); >>888
どこから突っ込んでいいかわからない。
今は出先でスマホから見てるので書くのが面倒だが、多分明日までには他の人が沢山ツッコミを入れている事だろう。 >>894
char line[64];
size_t len;
fgets(line, sizeof(line), stdin);
len = strlen(line);
if (len && line[len - 1] == '\n') line[len - 1] = 0;
if(strcmp(line, "dog") == 0)
{
printf("dogですよ\n");
} char line[64];
fgets(line, sizeof(line), stdin);
strtok(line, "\n");
if(strcmp(line, "dog") == 0)
{
printf("dogですよ\n");
} char line[256];
scanf("%255s", line);
scanfを使えないアホが
scanfをdisるのを見る度に
嘲笑するのも勿体ない気分になる これでもし入力条件が不明の長さで受け取らなきゃ行けなかったらどうすればいい? >>898
それ 256 という定数を変えるとき、いちいちレテラルの中を手書きで直すんですか?
いけてないですね… 入力バッファにちょっとゴミが混じるだけでscanfは使えなくなる。
そんな役立たずは、業務では使うべきではない。使うなら、fgetsとsscanfの方がいい。
我が国のコンピューター教育は残念ながら、業務では役に立たない言語を教えている。 むしろ余程プアな環境でない限り、業務でC言語は使うべきではない >>905
心配しなくても使われる所は限られてるよ。
OSそのものとかデバイスドライバとかな。
それも減りつつあるんじゃないかな。
まあしかし過去の資産がありすぎて捨てられないって感じか。
うまいこと互換性を保ちつつ次の段階へ行ければいいんだろうけどね。 MCUはほとんどがC言語
たまにC++
たまにアセンブラ >>899
その受け取ったデータをどう使うかによる >>914
ばかに見えるから止めた方がいいと思うよ 入力された文字列(例えば10文字程度)を、
数字だけ*に変えるプログラムを作りたいと思ってるんですが、
どうもうまく行きません
どなたか簡単なコード書いてくれませんか >>918
数字は半角の「*」でいいの?
それとも全角の「*」?
それによって処理の複雑さが変わる ああ、あと入力された文字列にはマルチバイト文字が含まれるのか、1バイト文字なのかも明確にしとかないとな >>918
お前さんが書いたコードをあげれば誰か添削くらいはしてくれるかもよ 入力部分には>>897を使わせてもらった
#include <stdio.h>
#include <string.h>
void mask_num(char *s)
{
char *c;
for (c = &s[0]; *c != '¥0'; c++)
{
if (*c > '0' && *c < '9') *c = '*';
}
}
int main()
{
char line[64];
fgets(line, sizeof(line), stdin);
strtok(line, "¥n");
mask_num(line);
printf("%s¥n", line);
return 0;
} プログラムのコードの話してるのに全角は無いわ。
データの話ならむしろ文字コードとかまで考えなきゃならんがな。 >>923
>if (*c > '0' && *c < '9') *c = '*';
if (*c >= '0' && *c <= '9') *c = '*';
だった >>918
を見て「*」を「*」に勝手に読みかえるようじゃ
受け入れ試験時で不具合が見つかって大幅手戻りが発生するぞ void mask_num(char *s)
{
while (*s) {
if (isdigit(*s)) *s = '*';
s++;
}
} 入力して変換して出力するだけでいいならこうかな。
#include <stdio.h>
#include <ctype.h>
int main()
{
int c;
while ((c = getchar()) != EOF)
if (isdigit(c))
putchar('*');
else
putchar(c);
return 0;
} >>926
しかしながら「数字を*に変えるプログラム組んどきましたよ」と言って
本当にASCIIの '*' でなくマルチバイトの "*" に変える処理だったら
発注側から「普通全角はないだろ、お前さん常識ないのか?」と
発言者にとって都合の良い「普通」「常識」の波状攻撃を受けるハメに。
その意味で >>919 と >>920 の態度は正しい。
世の中には自分のミスを認めたくない人もいるけどな。 今回の発注者は>>918だから注意喚起として * じゃないの?
って確認するのは正しいけど全角半角言うならむしろ数字と言うのが半角だけでいいのかを確認した方がいいかと
下手すると 壱萬弐仟参佰四拾伍 が変換されてないじゃないかとか言われるかも知れんし >>924
プログラムのコードの話なんてどこに書いてある? すいません遅れました
添削おねがいします
#include <stdio.h>
void num_star(char *p)
{
while (*p)
if(*p >= '0' && *p <= '9')
*p++ = '*';
}
int main(void)
{
char ch[10];
printf("文字列を入力せよ\n");
scanf("&s",ch);
num_star(ch);
printf("%s\n", ch);
return 0;
} >>933
scanfに"&s"は間違い"%9s"だ
if(*p >= '0' && *p <= '9')は標準関数でif(isdigit(*p))とできるのに勿体ない
p++はifの条件が偽のときに実行されなくなっている 数字以外の文字だけ入力されたら無限ループになって終わらないね。 >>934
関数コールは遅いしサイズも増える
標準ライブラリを全てリンクしてるかわからない
わざわざC言語を使う場面ていうのは
そういうことも多少は心配した方が良いこともある >>936
>標準ライブラリを全てリンクしてるかわからない
必要なものをリンクすればいいし、必要なものをリンクするように出来ているのでは? リンクしない選択をすることもあるのだよ
色々な理由で
特にわざわざC言語を使うような環境では >>936
> 標準ライブラリを全てリンクしてるかわからない
リンク? インプリメントの間違いだろ
何をリンクして何をリンクしないのかは
組み込みでは厳密に指定し結果も確認する
isdigitにはマクロバージョンもある
おそらくお前さんはそんなん知らんと言うだろうな
総じて、現物のコンパイラを細かくいじるということをせずに
上っ面だけ使って満足している手合いか >>936
そういう話は最低限の基本ができてから教えれば十分なことで、始めたばかりの初心者にあれこれ言ってかえって混乱させるのは良くないかと。 >>940
isdigitの指す文字が’0’〜’9’だけとも限らないからな(事実上は問題にならないとしても) digitの定義はlocaleに依存するので制御可能。
基本的にはisdigitが妥当だろうね。
自前でテーブル定義してもよい。大小で判断するのは危険だね。 >>944
> 大小で判断するのは危険だね。
危険だと思う理由は?
'0'〜'9' が連続してることは規格で保証されてる >>945
その規格とやらの文書番号は?
つまり何の規格かと >>946
X 3010:2003 (ISO/IEC 9899:1999)
5.2.1文字集合
ソース基本文字集合及び実行基本文字集合の双方において,10 進数字に関する上の並びにおいて,0 の右側に並んでいる各文字の値は,一つ左側にある文字の値に比べ 1 だけ大きくなければならない。 >>947
あれ本当だ
ということはCの翻訳環境でも実行環境でも
採用を禁じられる文字集合規格がありうるってことか
なんか出過ぎた決めごとだな >>948
> 採用を禁じられる文字集合規格
そんなもの見たことない >>949
「0 の右側に並んでいる各文字の値は,一つ左側にある文字の値に比べ 1 だけ大きく」なっていない文字集合は思いつけませんね…
ftp%3A//ftp.software.ibm.com/software/globalization/gcoc/attachments/CP00037.pdf >>949
いや俺も見たことないけどさ
それはASCII系が絶対的とでも言うほどの多数派で
遙かに遅れたEBCDICもそうなっているからだろ
科学的にそう規定すべき合理性あるか? レス数が950を超えています。1000を超えると書き込みができなくなります。