#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define BUF_LEN 100 // Length of input buffer
#define COUNT 5 // Initial number of strings
int main( void )
{
char buf[ BUF_LEN] ; // Input buffer
size_t str_count = 0 ; // Current string count
size_t capacity = COUNT; // Current maximum number of strings
char ** pS
= calloc ( capacity
, sizeof ( char * ) ) ; // Pointers to strings char ** psTemp = NULL; // Temporary pointer to pointer to char
char * pTemp = NULL; // Temporary pointer to char
size_t str_len = 0 ; // Length of a string
bool sorted = false ; // Indicated when strings are sorted
printf ( "Enter strings to be sorted, one per line. Press Enter to end:\n " ) ; // Read in all the strings
char * ptr = NULL;
while ( true )
{
ptr
= fgets ( buf
, BUF_LEN
, stdin
) ; if ( ! ptr) // Check for read error
{
printf ( "Error reading string.\n " ) ; pS = NULL;
return 1 ;
}
if ( * ptr == '\n ' ) break ; // Empty line check
if ( str_count == capacity)
{
capacity += capacity / 4 ; // Increase capacity by 25%
if ( ! ( psTemp
= realloc ( pS
, capacity
) ) ) return 1 ; pS = psTemp;
}
str_len = strnlen_s( buf, BUF_LEN) + 1 ;
if ( ! ( pS
[ str_count
] = malloc ( str_len
) ) ) return 2 ; strcpy_s( pS[ str_count++ ] , str_len, buf) ;
}
// Sort the strings in ascending order
while ( ! sorted)
{
sorted = true ;
for ( size_t i = 0 ; i < str_count - 1 ; ++ i)
{
if ( strcmp ( pS
[ i
] , pS
[ i
+ 1 ] ) > 0 ) {
sorted = false ; // We were out of order so. . .
pTemp = pS[ i] ; // swap pointers pS[i]. . .
pS[ i] = pS[ i + 1 ] ; // and. . .
pS[ i + 1 ] = pTemp; // pS[i + 1]
}
}
}
// Output the sorted strings
printf ( "Your input sorted in ascending sequence is:\n \n " ) ; for ( size_t i = 0 ; i < str_count; ++ i)
{
free ( pS
[ i
] ) ; // Release memory for the word pS[ i] = NULL; // Reset the pointer
}
I2RlZmluZSBfX1NURENfV0FOVF9MSUJfRVhUMV9fIDEKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojZGVmaW5lIEJVRl9MRU4gMTAwIC8vIExlbmd0aCBvZiBpbnB1dCBidWZmZXIKI2RlZmluZSBDT1VOVCA1IC8vIEluaXRpYWwgbnVtYmVyIG9mIHN0cmluZ3MKaW50IG1haW4odm9pZCkKewoJY2hhciBidWZbQlVGX0xFTl07IC8vIElucHV0IGJ1ZmZlcgoJc2l6ZV90IHN0cl9jb3VudCA9IDA7IC8vIEN1cnJlbnQgc3RyaW5nIGNvdW50CglzaXplX3QgY2FwYWNpdHkgPSBDT1VOVDsgLy8gQ3VycmVudCBtYXhpbXVtIG51bWJlciBvZiBzdHJpbmdzCgljaGFyICoqcFMgPSBjYWxsb2MoY2FwYWNpdHksIHNpemVvZihjaGFyKikpOyAvLyBQb2ludGVycyB0byBzdHJpbmdzCgljaGFyKiogcHNUZW1wID0gTlVMTDsgLy8gVGVtcG9yYXJ5IHBvaW50ZXIgdG8gcG9pbnRlciB0byBjaGFyCgljaGFyKiBwVGVtcCA9IE5VTEw7IC8vIFRlbXBvcmFyeSBwb2ludGVyIHRvIGNoYXIKCXNpemVfdCBzdHJfbGVuID0gMDsgLy8gTGVuZ3RoIG9mIGEgc3RyaW5nCglib29sIHNvcnRlZCA9IGZhbHNlOyAvLyBJbmRpY2F0ZWQgd2hlbiBzdHJpbmdzIGFyZSBzb3J0ZWQKCXByaW50ZigiRW50ZXIgc3RyaW5ncyB0byBiZSBzb3J0ZWQsIG9uZSBwZXIgbGluZS4gUHJlc3MgRW50ZXIgdG8gZW5kOlxuIik7CgkvLyBSZWFkIGluIGFsbCB0aGUgc3RyaW5ncwoJY2hhciAqcHRyID0gTlVMTDsKCXdoaWxlICh0cnVlKQoJewoJCXB0ciA9IGZnZXRzKGJ1ZiwgQlVGX0xFTiwgc3RkaW4pOwoJCWlmICghcHRyKSAvLyBDaGVjayBmb3IgcmVhZCBlcnJvcgoJCXsKCQkJcHJpbnRmKCJFcnJvciByZWFkaW5nIHN0cmluZy5cbiIpOwoJCQlmcmVlKHBTKTsKCQkJcFMgPSBOVUxMOwoJCQlyZXR1cm4gMTsKCQl9CgkJaWYgKCpwdHIgPT0gJ1xuJykgYnJlYWs7IC8vIEVtcHR5IGxpbmUgY2hlY2sKCQlpZiAoc3RyX2NvdW50ID09IGNhcGFjaXR5KQoJCXsKCQkJY2FwYWNpdHkgKz0gY2FwYWNpdHkgLyA0OyAvLyBJbmNyZWFzZSBjYXBhY2l0eSBieSAyNSUKCQkJaWYgKCEocHNUZW1wID0gcmVhbGxvYyhwUywgY2FwYWNpdHkpKSkgcmV0dXJuIDE7CgkJCXBTID0gcHNUZW1wOwoJCX0KCQlzdHJfbGVuID0gc3Rybmxlbl9zKGJ1ZiwgQlVGX0xFTikgKyAxOwoJCWlmICghKHBTW3N0cl9jb3VudF0gPSBtYWxsb2Moc3RyX2xlbikpKSByZXR1cm4gMjsKCQlzdHJjcHlfcyhwU1tzdHJfY291bnQrK10sIHN0cl9sZW4sIGJ1Zik7Cgl9CgkvLyBTb3J0IHRoZSBzdHJpbmdzIGluIGFzY2VuZGluZyBvcmRlcgoJd2hpbGUgKCFzb3J0ZWQpCgl7CgkJc29ydGVkID0gdHJ1ZTsKCQlmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cl9jb3VudCAtIDE7ICsraSkKCQl7CgkJCWlmIChzdHJjbXAocFNbaV0sIHBTW2kgKyAxXSkgPiAwKQoJCQl7CgkJCQlzb3J0ZWQgPSBmYWxzZTsgLy8gV2Ugd2VyZSBvdXQgb2Ygb3JkZXIgc28uIC4gLgoJCQkJcFRlbXAgPSBwU1tpXTsgLy8gc3dhcCBwb2ludGVycyBwU1tpXS4gLiAuCgkJCQlwU1tpXSA9IHBTW2kgKyAxXTsgLy8gYW5kLiAuIC4KCQkJCXBTW2kgKyAxXSA9IHBUZW1wOyAvLyBwU1tpICsgMV0KCQkJfQoJCX0KCX0KCS8vIE91dHB1dCB0aGUgc29ydGVkIHN0cmluZ3MKCXByaW50ZigiWW91ciBpbnB1dCBzb3J0ZWQgaW4gYXNjZW5kaW5nIHNlcXVlbmNlIGlzOlxuXG4iKTsKCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyX2NvdW50OyArK2kpCgl7CgkJcHJpbnRmKCIlcyIsIHBTW2ldKTsKCQlmcmVlKHBTW2ldKTsgLy8gUmVsZWFzZSBtZW1vcnkgZm9yIHRoZSB3b3JkCgkJcFNbaV0gPSBOVUxMOyAvLyBSZXNldCB0aGUgcG9pbnRlcgoJfQo=
compilation info
prog.c: In function ‘main’:
prog.c:38:3: warning: implicit declaration of function ‘strnlen_s’ [-Wimplicit-function-declaration]
str_len = strnlen_s(buf, BUF_LEN) + 1;
^
prog.c:40:3: warning: implicit declaration of function ‘strcpy_s’ [-Wimplicit-function-declaration]
strcpy_s(pS[str_count++], str_len, buf);
^
prog.c:46:3: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (size_t i = 0; i < str_count - 1; ++i)
^
prog.c:46:3: note: use option -std=c99 or -std=gnu99 to compile your code
prog.c:59:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (size_t i = 0; i < str_count; ++i)
^
prog.c:64:2: error: expected declaration or statement at end of input
}
^
prog.c:64:2: warning: control reaches end of non-void function [-Wreturn-type]
}
^
stdout