Problem s vicerozmernym polem – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problem s vicerozmernym polem – C / C++ – Fórum – Programujte.comProblem s vicerozmernym polem – C / C++ – Fórum – Programujte.com

 

PanPes
~ Anonymní uživatel
1 příspěvek
24. 2. 2009   #1
-
0
-

Zdravim, mam problem s vicerozmernym polem.... zdrojovy kod je psany v C. :
Jedna se o program, ktery ma rozdelovat retezce ktere jsou oddeleny nejakym znakem (v mem pripade mezerou), (neco jako v php funkce explode) a ukladat jednotliva slova do pole[n] . Jsem zacatecnik a nevim s tim rady.... program mi nevypisuje nic.

#include <stdio.h>

#include <stdlib.h>
#include <string.h>

#ifndef bool
#define bool char
#define false 0
#define true 1
#endif

int main()
{
char pole[15][15];
char s[15];
int i;
int nh=0;
int nl=0;
int np=0;
int k;
bool bol=true;

gets(s); //Nacteni dat
k=strlen(s);

for(i = 1; i <=k; i++)
{
if(s[np]==' ')
{
if(bol==false) //Pridani znaku '\0'
{
pole[nh][nl]='\0';
nh++;
nl=0;
}
bol=true;
np++;
}
else
{
pole[nh][nl]=s[nl];
nl++;
bol=false;
np++;
}
}

for(k=0; nh==k; k++)
{
printf("\nSlovo %d:\n%s\n", nh, pole[nh]);
}

printf("\n----------------------\n");
gets(s);
return 0;
}


Predem dekuji za radu :-)

Nahlásit jako SPAM
IP: 213.192.34.–
KIIV
~ Moderátor
+43
God of flame
24. 2. 2009   #2
-
0
-

vypisuj si informace i z jednotlivejch dulezitejch sekci...
takhle to clovek proste nevidi...

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
jouda
~ Anonymní uživatel
53 příspěvků
25. 2. 2009   #3
-
0
-

To PanPes : Neni tohle trochu blbost?

for(k=0; nh==k; k++)

{
printf("\nSlovo %d:\n%s\n", nh, pole[nh]);
}


Jen jsem na to teda rychle kouknul a nezkousel, ale podle me je jedna chyba v tom cyklu...nic neprochazi -> promenna nh je stale konstantni...



for(k=0; k < nh; k++) //nebyla chyba, jen to tahalo za oci :)
{
printf("\nSlovo %d:\n%s\n", nh, pole[nh][k]);
}


-> nemusi to byt to co chces, jen tip...

Nahlásit jako SPAM
IP: 212.20.106.–
m->29+6
Super člen
25. 2. 2009   #4
-
0
-

Takto vyzerá upravený a funkčný tvoj kód (poslednú medzeru hádže ako nové slovo...ale nechce sa mi to ladiť). Každopádne si pozri niekde na nete Konečný automat (finite state machine). Je to dobrá vec. A premenné si pomenuj ľubovolne, ale vhodne ;-)
Potom, v reále by som skôr predával len pointery na tie podreťazce v reťazci namiesto kopírovania znakov. Neviem, píšeš, že si začiatočník, ale tak pointery by som si mrkol.

#include <stdio.h>

#include <stdlib.h>
#include <string.h>

#ifndef bool
#define bool char
#define false 0
#define true 1
#endif

int main(void) {
char pole[15][15] = {{0}};
char retazec[15];
int i = 0;
int slov = 0;
int dlzkaSlova = 0;
bool priznakMedzery = true;

fgets(retazec, 15, stdin); // gets(retazec) -> buffer overflow

while(retazec[i] != 0) {
if(retazec[i] == ' ') {
if(priznakMedzery == false) {
pole[slov][dlzkaSlova] = '\0';
slov++;
dlzkaSlova = 0;
}
priznakMedzery = true;
}
else {
pole[slov][dlzkaSlova] = retazec[i];
dlzkaSlova++;
priznakMedzery = false;
}
i++;
}

for(int i=0; i<=slov; i++) {
printf("Slovo %d: %s\n", i+1, pole[i]);
}

return EXIT_SUCCESS;
}


Tak a tu som niečo stvoril ja - kritika plne vítaná;-)
#include <stdlib.h>

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

#ifndef bool
#define bool int
#define false 0
#define true 1
#endif

int main(void) {
char *slova[50] = {NULL}; // pole pointerov na načítané podreťazce
char retazec[100]; // zásobník pre reťazec
int i = 0; // iteračná pomocná premená
bool bolaMedzera = true; // príznak medzery
int slov = 0; // počet slov

fgets(retazec, 100, stdin); // načítanie 30 znakov do poľa

while(retazec[i] != 0) { // kým nie je koniec reťazca
if(retazec[i] == ' ' && !bolaMedzera) { // ak sme na medzere..
retazec[i] = 0; // ..nahraď ju koncom reťazca
bolaMedzera = true; // príznak medzery = true
}
else if(bolaMedzera && !isspace(retazec[i])) { // ak sme na inom znaku ako biely znak
slova[slov++] = &retazec[i]; // pripočítaj slovo, pridaj pointer na nové slovo
bolaMedzera = false; // nebola medzera
}
i++; // nový znak
}

/* len výpisy */
for(i=0; i<slov; i++) {
printf("Slovo %d: %s\n", i+1, slova[i]);
}

return EXIT_SUCCESS;
}

Nahlásit jako SPAM
IP: 147.229.178.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 42 hostů

Podobná vlákna

Problém s polem — založil Axik

Problém s polem — založil milanbartax

Problém s polem — založil K4BlOs

Problém s polem — založil renet

Problem s polem — založil Tomik

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý