amosq
amosq

Reputation: 111

Creating a toUpper function in C

I'm creating my own toUpper function in C, but keep getting a segmentation fault every time I attempt to run it. Can anyone provide me with any hints as to how to fix this problem?

int toUpper(char *str)
{
    int i;
    for(i=0;i< i <= strlen(str); i++) {
        if(str[i] >= 97 && str[i] <= 122) {
            str[i] = str[i] -32;
        }
    }
    return(str[i]);
}

int main()
{
    char string[20];

    printf("Enter any string:\n");
    scanf("%s", string);

    char result= (char)(toUpper(string));

    printf("The string in upper case is:%s\n", result);
}

Upvotes: 0

Views: 4059

Answers (4)

hko
hko

Reputation: 676

Another major issue in the code is the for loop statement.

for(i=0;i< i <= strlen(str); i++) ^ ^

It's probably a typo, but the i < i < wont work.

Upvotes: 1

chux
chux

Reputation: 154255

Recommend changing toUpper() to:

char *toUpper(char *str) {
  size_t len = strlen(str);
  size_t i;

  for (i = 0; i < len; i++) {
    if (str[i] >= 'a' && str[i] <= 'z') {
      str[i] = str[i] - 'a' + 'A'; 
    }
  }
  return str;
}
  1. Use correct index range i < strlen(str) vs. i <= strlen(str). This is the main issue. @Marc B

  2. Change return type. Suggested by @Weather Vane. like strcpy(), strcat()

  3. Calculate string length once, rather than many times.

  4. Use literals that match your goal: 'a' instead of 97. @marsh

  5. Use size_t for index and length. That is the type return by strlen() and is the best type to use for array access. Makes a difference with huge strings, but not with these simple examples.

  6. This code does depend on ASCII. This is often OK, but not completely portable.

  7. Change 32 to -'a' + 'A' per @user295691

Upvotes: 2

datdo
datdo

Reputation: 153

printf("The string in upper case is:%s\n", result);

result should be a char * but is a char. This is probably where your seg fault is happening. Other places include:

scanf("%s", string);

if the inputted string is longer than 19 chars, you could have problems due to string only being 20 chars long

  for(i=0;i< i <= strlen(str); i++) {

if str for whatever reason doesn't have an ending 0, you could seg fault there as well.

Upvotes: 1

Marc B
Marc B

Reputation: 360762

You're running off the end of the string:

for(i=0;i< i <= strlen(str); i++) {
              ^--

e.g. a 10 char string has characters 0->9, but you're looping 0->10. Change <= to < so you stop at 9.

Plus, you haven't set any limit on your scanf, so if someone enters a 21 char string, you'll exceed the storage you've allocated the string array.

Upvotes: 7

Related Questions