Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2022-01-22, 03:15
  #13
Medlem
Citat:
Ursprungligen postat av dunob
t.ex.

Kod:
#include <iostream>

int main(int argc, char **argv) {
    std::cout << std::stoi(argv[1]) + std::stoi(argv[2]) << std::endl;
    return 0;
}

Felhantering får du lösa själv

Ooops, TS får inte glöma bort att argv[0] är alltid programmets namn, kanske "main.exe" i detta fall.
Både argv[1] och argv[2] kan dock vara tomma strängar, eller att om man försöker accessa dem att man får felmeddelandet/exception "array out of bounds" eller något liknande.
Ifall main.exe anropas utan något argument så är i så fall argc == 1 och antalet argument är då 1, alltså detsamma som programmets namn.
Om strängen argv[2] finns så är argc >= 3.
OBS Vet förstås att TS måste göra felhanteringen själv, så dessa ovanstående tips är bara till hjälp för detta.
Citera
2022-01-22, 22:08
  #14
Medlem
Citat:
Ursprungligen postat av Enterprise
Om du istället använder std::getline stoppar den som default input vid newline och tar bort newline från strängen.
Alltså är längden på retursträngen lika med noll om du enbart trycker på enter.
Därför kan du upprepa loopen om längden är mer än noll.
Om det är heltal som du vill komma åt kan du använda stoi() på strängen.

http://cpp.sh/3cpmo

Kod:
// Example program
#include <iostream>
#include <string>

int main()
{
  
std::string name;
  
  
std::size_t l;
  do
  {
    
std::cout << "What is your name? ";
    
std::getline (std::cinname);
    
l=name.length();
    if (
l>0
      
std::cout << "Hello, " << name << "!\n";
  } while (
l>0);


Läs mer:

https://www.cplusplus.com/reference/...tring/getline/

och om man ska skriva motsvarande program i C, jag försöker med följande:
Kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int sum = 0;
	char numbers[255];
	size_t l;
	do
	{
    	scanf("%s",numbers);
    	l = strlen(numbers);
    	if (l > 0)
        	sum += atoi(numbers);
	} while (l > 0);
	printf("%d",sum);
}

Problemet är:
l = strlen(numbers)
får inte längden på användarens input?
Motsvarande function för blanksteg = 0 verkar inte fungera med varken strlen eller sizeof så det måste vara något jag missat här?
Citera
2022-01-23, 07:53
  #15
Medlem
edit: inte blanksteg, retur...
Citera
2022-01-23, 09:17
  #16
Moderator
vhes avatar
Citat:
Ursprungligen postat av bosscs2
Problemet är:
l = strlen(numbers)
får inte längden på användarens input?

Varför förväntar du dig att användarens input ligger i variabeln numbers?
Citera
2022-01-23, 10:00
  #17
Medlem
Citat:
Ursprungligen postat av vhe
Varför förväntar du dig att användarens input ligger i variabeln numbers?

Därför att:
Kod:
scanf("%s",numbers);
fungerar som getline() i c++, tar input från användaren?
Citera
2022-01-23, 10:13
  #18
Moderator
vhes avatar
Citat:
Ursprungligen postat av bosscs2
Därför att:
Kod:
scanf("%s",numbers);
fungerar som getline() i c++, tar input från användaren?

Hah, ja! Grovt feltänk av mig där, ber om ursäkt.
Citera
2022-01-23, 10:38
  #19
Moderator
vhes avatar
Citat:
Ursprungligen postat av bosscs2
och om man ska skriva motsvarande program i C, jag försöker med följande:
Kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int sum = 0;
	char numbers[255];
	size_t l;
	do
	{
    	scanf("%s",numbers);
    	l = strlen(numbers);
    	if (l > 0)
        	sum += atoi(numbers);
	} while (l > 0);
	printf("%d",sum);
}

Problemet är:
l = strlen(numbers)
får inte längden på användarens input?
Motsvarande function för blanksteg = 0 verkar inte fungera med varken strlen eller sizeof så det måste vara något jag missat här?

(Så, efter att ha läst lite i manual-sidan - jag kan som kanske märks inte C)

Programmet fungerar ju så länge du ger input. scanf() tar en formatsträng, och läser tills den hittat input för att fylla formatsträngen. Den är m.a.o. inte nöjd med bara ett returntecken, och kommer att blockera tills du gett annan indata. Om du skickar ett EOF (t.ex. trycker Ctrl+D om du sitter i en Linux-terminal) så kommer den att returnera, även om resultatet då troligen inte blir exakt vad du vill. Du behöver titta på returvärdet från scanf() för att se om den lyckades, och om inte avbryta tidigt.
Citera
2022-01-23, 10:40
  #20
Medlem
Citat:
Ursprungligen postat av vhe
Hah, ja! Grovt feltänk av mig där, ber om ursäkt.

jag vet inte om det är rätt?
scanf() tar värde från användaren men om värdet är tomt som att trycka på returknappen så verkar funktionen ignorera det?
Citera
2022-01-23, 12:54
  #21
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av bosscs2
och om man ska skriva motsvarande program i C, jag försöker med följande:
Kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int sum = 0;
	char numbers[255];
	size_t l;
	do
	{
    	scanf("%s",numbers);
    	l = strlen(numbers);
    	if (l > 0)
        	sum += atoi(numbers);
	} while (l > 0);
	printf("%d",sum);
}

Problemet är:
l = strlen(numbers)
får inte längden på användarens input?
Motsvarande function för blanksteg = 0 verkar inte fungera med varken strlen eller sizeof så det måste vara något jag missat här?
Jag är inte expert på vare sig C++ eller C, men C++ har en strängklass som inte kan appliceras på C.
C-style strängar är alltså annorlunda. En tom sträng i C innehåller en byte efter de är noll-avslutade.

Kolla på detta program där msan använder getline för att se hur du gör, men den tomma strängen innehåller 1 tecken inte 0, vilket du märker om du test kör detta på t.ex. https://cplayground.com/

Kod:
#include <stdio.h>
#include <stdlib.h>

int input(char *s,int length);

int main()
{
    
char *buffer;
    
size_t bufsize 32;
    
size_t characters;

    
buffer = (char *)malloc(bufsize sizeof(char));
    if( 
buffer == NULL)
    {
        
perror("Unable to allocate buffer");
        exit(
1);
    }

    
printf("Type something: ");
    
characters getline(&buffer,&bufsize,stdin);
    
printf("%zu characters were read.\n",characters);
    
printf("You typed: '%s'\n",buffer);

    return(
0);

__________________
Senast redigerad av Enterprise 2022-01-23 kl. 12:58.
Citera
2022-01-23, 13:18
  #22
Medlem
Ok lösningen är att scanf() ignorerar blanksteg, returnerar ingenting. Därför måste man använda fgets(int exempel, param2, stdin) som initierar 1 vid blanksteg.
Citera
2022-01-23, 15:05
  #23
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av bosscs2
Ok lösningen är att scanf() ignorerar blanksteg, returnerar ingenting. Därför måste man använda fgets(int exempel, param2, stdin) som initierar 1 vid blanksteg.
getline eller fgets (saken kan diskuteras):
https://stackoverflow.com/questions/...ation/55970443
__________________
Senast redigerad av Enterprise 2022-01-23 kl. 15:07.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in