The following
int num_strings;
char arr[num_strings][100];
scanf("%d",&num_strings);
is out of order. Changing the value of num_strings
does not retroactively adjust the size of arrays that were initialized using this variable. As such, arr
is initialized with an indeterminate value, since num_strings
is uninitialized. This is an example of invoking Undefined Behavior.
&arr[i]
is of type char (*)[100]
, you simply want arr[i]
, which will decay to a char *
(the correct type for %s
) when passed to scanf
.
Remove the trailing whitespace from the scanf
format, or it will hang until it reads non-whitespace ("%s\n"
-> "%s"
).
Limit the length of the strings you read with a field-width specifier as to not overflow the buffers (%99s
).
strlen
returns a size_t
, the format specifier for printing this is %zu
.
Note that scanf
can fail for a variety of reasons. Consider checking that the return value of each call was (or was not) the expected number of conversions, e.g.,
if (2 != scanf("%d%d", &a, &b))
/* failure */;
and handle any failures.
Here is a functional version of your program, without error checking:
#include <stdio.h>
#include <string.h>
int main(void) {
int num_strings;
scanf("%d", &num_strings);
char arr[num_strings][100];
for (int i = 0; i < num_strings; i++)
scanf("%99s", arr[i]);
for (int j = 0; j < num_strings; j++) {
if (strlen(arr[j]) > 10) {
printf("%c%zu%c\n",
arr[j][0], strlen(arr[j]) - 2,
arr[j][strlen(arr[j]) - 1]);
} else {
printf("%s\n", arr[j]);
}
}
}
stdin
:
3
hello
thisisalongerstring
world
stdout
:
hello
t17g
world