Καλημέρα (θα φύγω απόγευμα τελικά).
Έχει πάρα πολλά θέματα ο κώδικάς σου. Θα στα πω χωρίς παραθέσεις.
Καταρχήν, το ότι το Ν είναι το μέγιστο μήκος του str δεν σημαίνει πως ο χρήστης θα σου πληκτρολογήσει εγγυημένα τόσους ή περισσότερους χαρακτήρες. Ειδικά στο παράδειγμά σου, το "hello" αποτελείται από μόλις 6 χαρακτήρες, συμπεριλαμβανομένου του '\0' στο τέλος του. Κι επειδή το διαβάζεις με την fgets() περιέχει κι ένα '\n' πριν από το '\0', άρα συνολικά έχει 7 χαρακτήρες.
Οπότε εκείνο το
&str[N] που γράφεις (με το N ορισμένο σε 256) ουσιαστικά αναφέρεται στον... γάμο του καραγκιόζη

, και πιο συγκεκριμένα αναφέρεται στο 256ο byte μνήμης, μετρώντας από το byte στο οποίο είναι καταχωρημένος ο 1ος χαρακτήρας του str.
Επίσης, με αυτό που γράφεις:
- Κώδικας: Επιλογή όλων
fgets(str, N, stdin);
sscanf(str, "%c", &str[N]);
τι προσπαθείς να κάνεις; Έτσι όπως το έχεις, έχεις διαβάσει το str και μετά πας και βάζεις τον 256ο χαρακτήρα του (που είναι κι εκτός ορίων, αφού το str τελειώνει στον str[255] ) να περιέχει ότι και ο 1ος χαρακτήρας του str.
Αν θες να δεις ποιος είναι ο τελευταίος διαβασμένος χαρακτήρας του str (τρέχον μήκος) ή πρέπει να χρησιμοποιήσεις την έτοιμη strlen() ή να πιάσεις μόνος σου το str από την αρχή και να μετράς χαρακτήρες μέχρι να βρεις τον '\0'.
Το ίδιο πρόβλημα έχουν και τα loop σου, που χρησιμοποιούν το N για άνω όριο. Και περιττό είναι αφού από το str[ strlen(str) ] και μετά δεν χρειάζεται καν να πηγαίνεις, αλλά είναι και λάθος αφού σε ένα string μήκους N ο τελευταίος του χαρακτήρας δεν είναι ο N αλλά ο N-1.
Το παραπάνω αποτελεί ένα από τα πλεονεκτήματα των c-strings, επειδή μπορείς να βρεις μόνος σου που τελειώνει το τρέχον μήκος τους... εκεί που βρίσκεται ο πρώτος μηδενικός χαρακτήρας. Αυτό το χρησιμοποιούμε κατά κόρον όταν διαχειριζόμαστε τα strings με δείκτες (αλλά όχι μόνο) χωρίς να χρειάζεται να αναφερθούμε καν στο τρέχον μήκος τους.
Σου παραθέτω κώδικα για αυτό που προσπαθείς να κάνεις...
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#define MAX_SLEN 255+1
// ------------------------------------------------------------------------------
int main( void )
{
char s[ MAX_SLEN ] = ""; // το string
char *cp; // δείκτης σε χαρακτήρα
printf("Dwste mia simvoloseira: "); // ανάγνωση του string
fgets(s, MAX_SLEN, stdin); // διαβάζει και το '\n' στο τέλος
// αντικατάσταση του '\n' που βάζει η fgets στο τέλος του s με '\0'
for (cp = s; *cp != '\0' && *cp != '\n'; cp++) // έως ότου βρεις '\0' ή '\n'
; // ... επανέλαβε
*cp = '\0'; // βάλε '\0' εκεί που σταμάτησες
// ο cp δείχνει ήδη στο τέλος του s
while ( cp-- != s ) // εκτύπωση του string ανάποδα
putchar( *cp );
putchar('\n'); // αλλαγή γραμμής στην οθόνη
for (cp = s; *cp != '\0'; cp++ ) // εκτύπωση του string κανονικά
putchar( *cp );
putchar('\n'); // αλλαγή γραμμής στην οθόνη
return 0;
}
Star_Light έγραψε:και ιδου μια πιο βελτιωμενη εκδοση της παραπανω συμφωνα με την οποια η εισοδος δεν ειναι καθορισμενη.... και δεν αρχικοποιειται μεσα απο τον κωδικα αλλα την δινει ο χρηστης....
- Κώδικας: Επιλογή όλων
#include<stdio.h>
#include<stdlib.h>
#define N 256
void func(char *str_ptr);
int main()
{
char str[N]="";
char *str_ptr;
int i;
printf("Dwste mia simvoloseira: \n");
fgets(str,N,stdin);
sscanf(str,"%c",&str[N]);
/*for(i=0; i<N; i++)
{
scanf(str,"%c",&str[N]);
}*/
str_ptr=&str[N];
for(i=N; i>0; i--)
{
str_ptr--;
printf("%c",*str_ptr);
}
printf("\n");
str_ptr=&str[0];
for(i=0; i<N; i++)
{
str_ptr++;
printf("%c",*str_ptr);
}
//func(&str_ptr);
return 0;
}
/*void func(char *str_ptr)
{
int i;
for(i=0; i<5; i++)
{
str_ptr++;
printf("%c",*str_ptr);
}
return;
}*/
επειδη ομως δεν την παλευω αλλο παω να την πεσω....
απλα το προβλημα με αυτον τον κωδικα ειναι πως αν πχ δωσω την hello
μου τα βγαζει ετσι
- Κώδικας: Επιλογή όλων
olleh
ello
h
Το h δεν καταλαβαινω γιατι το βγαζει απο κατω....